我需要在存储过程 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;
/
我遇到了 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;
/