英文:
When i call package.function within a procedure and function return value in cursor, how can i store these value in procedure variable in Oracle SQL?
问题
以下是要翻译的代码部分:
CREATE OR REPLACE PROCEDURE LIST_LOG(name VARCHAR2, id VARCHAR2, label VARCHAR2)
IS
v_query VARCHAR2(4000);
v_cursor SYS_REFCURSOR;
v_result VARCHAR2(4000);
BEGIN
CASE label
WHEN 'abc' THEN
v_query := 'SELECT PKG_LIST_LOG.abc('''||name||''','''||id||''','''||label||''') FROM DUAL';
OPEN v_cursor FOR v_query;
FETCH v_cursor INTO v_result;
-- EXECUTE IMMEDIATE v_query INTO v_result;
DBMS_OUTPUT.PUT_LINE(v_result);
ELSE
DBMS_OUTPUT.PUT_LINE('INVALID PARAMETERS');
END CASE;
END;
/
请注意,我只提供了代码部分的翻译。
英文:
The PKG_LIST_LOG.abc (package.function) return a value like {<PR=100: ORA-01403: no data ,SC=ORA-01403: no data found,PSC=sp_ls :LA,EXEC_DATE=04-MAY-23>,} so how can i store this information in the below procedure and print the result.
CREATE OR REPLACE PROCEDURE LIST_LOG(name VARCHAR2, id VARCHAR2, label VARCHAR2)
IS
v_query VARCHAR2(4000);
v_cursor SYS_REFCURSOR;
v_result VARCHAR2(4000);
BEGIN
CASE label
WHEN 'abc' THEN
v_query := 'SELECT PKG_LIST_LOG.abc('''||name||''','''||id||''','''||label||''') FROM DUAL';
OPEN v_cursor FOR v_query;
FETCH v_cursor INTO v_result;
-- EXECUTE IMMEDIATE v_query INTO v_result;
DBMS_OUTPUT.PUT_LINE(v_result);
ELSE
DBMS_OUTPUT.PUT_LINE('INVALID PARAMETERS');
END CASE;
END;
/
答案1
得分: 0
你应该只是将 abc
函数的结果放入 v_cursor
中。由于我没有你的表格或数据(你也没有发布任何额外信息),这里是基于 Scott 的示例模式的示例。
函数返回 ref cursor:
create or replace function abc(p_deptno in number, p_job in varchar2)
return sys_refcursor
is
rc sys_refcursor;
begin
open rc for select ename, sal
from emp
where deptno = p_deptno
and job = p_job;
return rc;
end;
/
过程调用该函数;请注意第 7 行 - 这是你应该做的;你的代码中没有 动态 部分,所以你不需要构建调用该函数的 select
语句,也不需要打开一个游标 - 只需使用函数返回的内容:
create or replace procedure list_log(p_deptno in number, p_job in varchar2)
is
v_cursor sys_refcursor;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
v_cursor := abc(p_deptno, p_job);
loop
fetch v_cursor into v_ename, v_sal;
exit when v_cursor%notfound;
dbms_output.put_line(v_ename ||' '|| v_sal);
end loop;
close v_cursor;
end;
/
测试:
set serveroutput on
exec list_log(20, 'CLERK');
输出是否正确?看起来是的:
select ename, sal from emp where deptno = 20 and job = 'CLERK';
英文:
The way I understood it, you should just put result of the abc
function into v_cursor
.
As I don't have your tables nor data (and you didn't post any additional info), here's an example based on Scott's sample schema.
Function returns ref cursor:
SQL> create or replace function abc(p_deptno in number, p_job in varchar2)
2 return sys_refcursor
3 is
4 rc sys_refcursor;
5 begin
6 open rc for select ename, sal
7 from emp
8 where deptno = p_deptno
9 and job = p_job;
10 return rc;
11 end;
12 /
Function created.
Procedure calls that function; note line #7 - that's what you should do; there's nothing dynamic in your code so you don't have / need to compose a select
statement which calls the function, nor should you open a cursor - just use what function returned:
SQL> create or replace procedure list_log(p_deptno in number, p_job in varchar2)
2 is
3 v_cursor sys_refcursor;
4 v_ename emp.ename%type;
5 v_sal emp.sal%type;
6 begin
7 v_cursor := abc(p_deptno, p_job);
8 loop
9 fetch v_cursor into v_ename, v_sal;
10 exit when v_cursor%notfound;
11 dbms_output.put_line(v_ename ||' '|| v_sal);
12 end loop;
13 close v_cursor;
14 end;
15 /
Procedure created.
Testing:
SQL> set serveroutput on
SQL> exec list_log(20, 'CLERK');
SMITH 840
ADAMS 1100
PL/SQL procedure successfully completed.
Is that output correct? Looks like it is:
SQL> select ename, sal from emp where deptno = 20 and job = 'CLERK';
ENAME SAL
---------- ----------
SMITH 840
ADAMS 1100
SQL>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论