我需要在存储过程 PL/SQL 上使用 SELECT - JOIN 语句

I need to use a SELECT - JOIN sentence on a stored procedure PL/SQL

我遇到了 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查询的数据 我怎样才能做到这一点?我是新来的 感谢您的帮助

这应该有效。一个好的做法是为本地 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;
/

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

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;

如果您使用的是 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;
/