我按如下方式创建了一个包:
create or replace package apps.xx_sal
as
PROCEDURE SAL_HIST_C(p_person_id IN NUMBER
,p_success OUT VARCHAR2
,p_sql OUT VARCHAR2
,p_cur OUT SYS_REFCURSOR)
IS
l_success VARCHAR2(32000) := 'OK';
l_sql VARCHAR2(32767);
l_sql_empty VARCHAR2(32767);
l_step VARCHAR2(1000);
l_query_length PLS_INTEGER := 0;
c_process CONSTANT VARCHAR2(200) := 'SAL_HIST_C';
BEGIN
l_step := c_process || ' :: BUILD EMPTY SQL';
--
l_sql_empty := ' SELECT person_id
,pay_basis_id
,change_date
from apps.salary_hist_v
WHERE 1 = 2 ';
--
--
l_step := c_process || ' :: BUILD SQL';
--
l_sql :=
'
SELECT paf.person_id
,paf.pay_basis_id
,ppp.change_date change_date
FROM hr.per_pay_proposals ppp
,per_all_assignments_f paf
WHERE paf.primary_flag = ''Y''
AND ppb.pay_basis_id = paf.pay_basis_id
AND paf.person_id = :l_person_id ';
--
-- check sql query
l_query_length := LENGTH(l_sql);
--DBMS_OUTPUT.put_line ('Length of EXECUTED SQL := ' || l_query_length);
-- open cursor with bind variables applied
--
l_step := c_process || ' :: OPEN CURSOR with BIND VARIABLE APPLIED';
--
OPEN p_cur FOR l_sql USING p_person_id;
l_success := 'OK';
p_sql := l_sql;
p_success := l_success;
EXCEPTION
WHEN OTHERS
THEN
l_success := 'ERROR :: ' || l_step || CHR(10) || SQLERRM || CHR(10) || DBMS_UTILITY.format_error_backtrace;
p_sql := l_sql;
p_success := l_success;
OPEN p_cur FOR l_sql_empty;
END SAL_HIST_C;
现在当我传递参数以查看输出时发生错误:
DECLARE
--l_person_id number;
l_success VARCHAR2(32000) ;
l_sql VARCHAR2(32767);
l_cur sys_refcursor;
BEGIN
APPS.xx_sal.SAL_HIST_C (
person_id=>4816,
p_success => l_success,
p_sql=>l_sql,
p_cur => :l_cur);
COMMIT;
DBMS_OUTPUT.PUT_LINE ('Output Returned from Proc :: ' || l_success);
DBMS_OUTPUT.PUT_LINE ('SQL Executed for the GRID :: ' || l_cur);
END;
错误:
[错误]执行(10:3):ORA-06550:第10行,第3栏:
PLS-00306:调用' SAL_HIST_C'中的参数数量或类型错误 ORA-06550:第10行,第3栏:
PL / SQL:语句被忽略
ORA-06550:第18行,第23栏:
PLS-00306:调用' ||'
时参数的数量或类型错误 ORA-06550:第18行,第1栏:
PL / SQL:忽略语句
我不知道为什么会发生错误。我在Toad执行。我想我没有正确地调用匿名块中的过程
答案 0 :(得分:0)
@ user3809240
您的邮件中有两个ORA错误。
<强> 1。 PLS-00306:调用&#39; SAL_HIST_C&#39;
的参数数量或类型错误替换
APPS.xx_sal.SAL_HIST_C (person_id=>4816, p_success => l_success, p_sql=>l_sql,p_cur => :l_cur);
与
APPS.xx_sal.SAL_HIST_C (4816, l_success, l_sql,l_cur);
<强> 2。 PLS-00306:调用&#39; ||&#39;
的参数数量或类型错误我们不能做refcursor的控制台输出。注释掉下面的行,然后重新运行你的来电程序。
DBMS_OUTPUT.PUT_LINE ('SQL Executed for the GRID :: ' || l_cur);
现在,它应该可以完美运作。
干杯,
马杜。
PS:如果我的解决方案有效,请将此帖子标记为答案。 :)
答案 1 :(得分:0)
我看错了两件事:
您的存储过程有一个名为p_person_id
的参数,但您使用名为person_id
的参数调用它。
您无法连接字符串和引用游标。如果要显示引用光标所产生的值,则必须重复从光标中获取值,显示每一行,直到没有任何一行为止。
顺便说一下,我没有看到COMMIT
的重点,因为您没有插入,更新或删除的数据。