【问题标题】:I need to use a SELECT - JOIN sentence on a stored procedure PL/SQL我需要在存储过程 PL/SQL 上使用 SELECT - JOIN 语句
【发布时间】:2018-04-29 23:47:33
【问题描述】:

我在使用 Oracle SQL 时遇到了问题。我需要在存储过程中使用这个 PL/SQL 语句:

select t.ID_CURSO,p.DESCRIPCION,p.FECHA_INICIO,p.FECHA_FIN 
      from curso t 
      inner join contrato c on t.ID_CURSO = c.curso_id_curso
      inner join PAQUETE_ACTIVIDADES p on 
            c.ID_PAQUETE_ACTIVIDADES_ID = p.ID_PAQUETE_ACTIVIDADES
where id_curso=value;

我需要显示这个选择查询的数据 我怎样才能做到这一点?我是新来的 感谢您的帮助

【问题讨论】:

  • 那你用了之后喜欢做什么呢?
  • 您可能还会看到对此给出的答案:stackoverflow.com/questions/4864404/…
  • 关于如何从程序中获取输出的问题?通常你可以传回一个引用光标,但这取决于你需要它。

标签: oracle plsql oracle11g oracle-sqldeveloper plsqldeveloper


【解决方案1】:

如果您使用的是 Oracle 12c,则可以使用 DBMS_SQL.RETURN_RESULT

CREATE OR REPLACE PROCEDURE pr_show_output
AS
   l_cursor   SYS_REFCURSOR;
BEGIN
   OPEN l_cursor FOR
      SELECT t.ID_CURSO,
             p.DESCRIPCION,
             p.FECHA_INICIO,
             p.FECHA_FIN
        FROM curso t
             INNER JOIN contrato c ON t.ID_CURSO = c.curso_id_curso
             INNER JOIN PAQUETE_ACTIVIDADES p
                ON c.ID_PAQUETE_ACTIVIDADES_ID = p.ID_PAQUETE_ACTIVIDADES
       WHERE id_curso = VALUE;

   DBMS_SQL.return_result (l_cursor);
END;
/

【讨论】:

    【解决方案2】:

    这应该可以。一个好的做法是为本地 PL/SQL 变量指定一个特定的符号,例如在这里 (l:local, i:id) l_i_value:

    declare 
      l_i_value integer := 14;
    begin
        dbms_output.enable(1000000);
        for x in (
        select t.ID_CURSO,p.DESCRIPCION,p.FECHA_INICIO,p.FECHA_FIN 
              from curso t 
              inner join contrato c on t.ID_CURSO = c.curso_id_curso
              inner join PAQUETE_ACTIVIDADES p on 
                    c.ID_PAQUETE_ACTIVIDADES_ID = p.ID_PAQUETE_ACTIVIDADES
        where id_curso=l_i_value )
        loop
          dbms_output.put_line('---');
          dbms_output.put_line(x.ID_CURSO);
          dbms_output.put_line(x.DESCRIPCION);
       -- ...
        end loop;
    end;
    /
    

    【讨论】:

    • 谢谢! l_i_value 将帮助我循环表格吗?如果有一段时间会有帮助吗?因为我需要查看整张桌子
    • @EduardoWayoCarrascoNuñez,不,这是一个将传递给您的选择查询的局部变量。 x 将自动采用 select WHERE id_curso=l_i_value (14,在 DECLARE 语句中设置)返回的每个值。
    • 哦!我明白了,它对我很有帮助,非常感谢这个查询对我有帮助
    【解决方案3】:

    这里是一个例子。希望对你有帮助

    CREATE OR REPLACE PROCEDURE my_first_stored_proc IS
    v_sql varchar2(2000);
    v_ID_CURSO number;
    v_DESCRIPCION varchar2(500);
    v_FECHA_INICIO varchar2(50);
    v_FECHA_FIN number;
    BEGIN
     v_sql := 'select t.ID_CURSO,p.DESCRIPCION,p.FECHA_INICIO,p.FECHA_FIN ';
     v_sql := v_sql||' from curso t ';
     v_sql := v_sql||' inner join contrato c on t.ID_CURSO = c.curso_id_curso 
       ';
     v_sql := v_sql||' inner join PAQUETE_ACTIVIDADES p on ';
     v_sql := v_sql||' c.ID_PAQUETE_ACTIVIDADES_ID = p.ID_PAQUETE_ACTIVIDADES ';
     v_sql := v_sql||' where id_curso=value ';
    
      --the result is one row selected 
     EXECUTE IMMEDIATE v_sql INTO v_ID_CURSO,v_DESCRIPCION,v_FECHA_INICIO, 
     v_FECHA_FIN;
     --// Do something else with variable 
      v_ID_CURSO,v_DESCRIPCION,v_FECHA_INICIO, v_FECHA_FIN
       -- ...
      --// End -Do something else with variable 
      v_ID_CURSO,v_DESCRIPCION,v_FECHA_INICIO, v_FECHA_FIN
     --// Or you can save select result in a table by doing something like this
      v_sql := 'create table my_first_table As ';
      v_sql := v_sql||' select 
      t.ID_CURSO,p.DESCRIPCION,p.FECHA_INICIO,p.FECHA_FIN ';
       v_sql := v_sql||' from curso t ';
      v_sql := v_sql||' inner join contrato c on t.ID_CURSO = c.curso_id_curso 
      ';
      v_sql := v_sql||' inner join PAQUETE_ACTIVIDADES p on ';
      v_sql := v_sql||' c.ID_PAQUETE_ACTIVIDADES_ID = p.ID_PAQUETE_ACTIVIDADES 
      ';
      v_sql := v_sql||' where id_curso=value ';
      EXECUTE IMMEDIATE v_sql;
       --// Do something else with my_first_table
      -- ...
       --// End -Do something else with my_first_table
    
       --// and so on....
    
     EXCEPTION 
     WHEN OTHERS THEN
       dbms_output.put_line('ERROR: '||sqlerrm);
     END my_first_stored_proc;
    

    【讨论】:

    • 是的,它对我有很大帮助!我要练习这个
    • 通常动态 SQL 是不得已而为之,在运行时更改架构有各种不利因素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2010-12-24
    相关资源
    最近更新 更多