代码之家  ›  专栏  ›  技术社区  ›  Eduardo Wayo Carrasco Nuñez

我需要在存储过程PL/SQL上使用选择连接语句

  •  1
  • Eduardo Wayo Carrasco Nuñez  · 技术社区  · 7 年前

    我对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;
    

    我需要显示此select查询的数据 我该怎么做?我是新手 谢谢你的帮助

    3 回复  |  直到 6 年前
        1
  •  2
  •   Kaushik Nayak    7 年前

    如果您使用的是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
  •  0
  •   J. Chomel    7 年前

    这应该行得通。一个好的做法是为局部PL/SQL变量指定一个特定的符号,比如这里( l :本地, 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;
    /
    
        3
  •  -1
  •   aljassi    7 年前

    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;