打开RefCursor时Oracle ORA:01031
在执行下面的过程时,抛出错误ORA:01031 如果您在过程结束时仔细查看此代码 那是打开RefCursor时Oracle ORA:01031,oracle,stored-procedures,oracle11g,ref-cursor,Oracle,Stored Procedures,Oracle11g,Ref Cursor,在执行下面的过程时,抛出错误ORA:01031 如果您在过程结束时仔细查看此代码 那是 "v_strSQL := v_strSQL1||' UNION ALL '||v_strSQL2||' UNION ALL '||v_strSQL3||' UNION ALL '||v_strSQL4||' UNION ALL '||v_strSQL5||' UNION ALL '||v_strSQL6;" 当我移除所有的接头时,效果很好,但我必须在我的情况下使用所有的接头 这是造成问题的原因,请提前感谢
"v_strSQL := v_strSQL1||' UNION ALL '||v_strSQL2||' UNION ALL '||v_strSQL3||'
UNION ALL '||v_strSQL4||' UNION ALL '||v_strSQL5||' UNION ALL '||v_strSQL6;"
当我移除所有的接头时,效果很好,但我必须在我的情况下使用所有的接头
这是造成问题的原因,请提前感谢
create or replace PROCEDURE "PR_COUNTS"
(
v_CabID1 INT,
v_CabID2 INT,
v_ASSIGNTO_DEPT_NO VARCHAR2,
v_EMP_NO VARCHAR2,
v_USER_ID VARCHAR2,
v_HRDB VARCHAR2,
v_SQL INT,
tbl_cur out sys_refcursor
) AS
v_MainTable VARCHAR2(20);
v_ActionHistory VARCHAR2(30);
v_Assignment VARCHAR2(30);
v_strSQL1 LONG;
v_strSQL2 LONG;
v_strSQL3 LONG;
v_strSQL4 LONG;
v_strSQL5 LONG;
v_strSQL6 LONG;
v_strSQL LONG;
-- SELECT FN_INLOP_SUBJECTS(I.DOCNO) INTO MAIN_SUBJECT FROM DUAL
BEGin
SELECT MAIN_TABLE INTO V_MainTable FROM OAEFILE_CABINET WHERE CABINETID = V_CabID1;
SELECT ACTION_HST_TABLE INTO V_ActionHistory FROM OAEFILE_CABINET WHERE CABINETID=V_CabID1;
SELECT ASSIGNMENT_TABLE INTO V_Assignment FROM OAEFILE_CABINET WHERE CABINETID=V_CabID1;
v_strSQL1 :=
'
select 1 COL1,
1 COL2,
''Not Yet Accepted'' COL3,''قيود غير مستلمة'' COL4,
count(1) COL5,
''5503'' COL6
from '||V_MainTable||'
WHERE INDOCNO > ''0'' AND
BAYAN_FLAG = 1 AND
FCNTCT_ID IS NOT NULL AND
ASSGNCNTCT_ID = '''||V_EMP_NO||''' AND
ASSIGNTO_DEPT_NO = '''||V_ASSIGNTO_DEPT_NO||''' AND
STATUS_ID IN (2) AND
DOCDATE BETWEEN
CASE
WHEN '||v_SQL||' = 1 THEN SYSDATE-30
WHEN '||v_SQL||' = 2 THEN SYSDATE-90
WHEN '||v_SQL||' = 3 THEN SYSDATE-365
END
AND
SYSDATE';
v_strSQL2 :=
'
SELECT 1 COL1,
2 COL2,
''Assigned to Dept'' COL3,''إدارة الوثائق'' COL4,
COUNT(1) COL5,
''309'' COL6
FROM '||V_MainTable||'
WHERE INDOCNO > ''0'' AND
NUM_FIELD1 IN (0,1) AND
BAYAN_FLAG = ''0'' AND
ASSIGNTO_DEPT_NO = '''||V_ASSIGNTO_DEPT_NO||''' AND
ASSGNCNTCT_ID IN (SELECT EMP_NO FROM HR.EMPLS WHERE DEPT_NO = '''||V_ASSIGNTO_DEPT_NO||''') AND
STATUS_ID IN (2) AND
DOCDATE BETWEEN
CASE
WHEN '||v_SQL||' = 1 THEN SYSDATE-30
WHEN '||v_SQL||' = 2 THEN SYSDATE-90
WHEN '||v_SQL||' = 3 THEN SYSDATE-365
END
AND
SYSDATE'
;
v_strSQL3 :=
'
SELECT 1 COL1,
3 COL2,
''Assigned to employees'' COL3,''وثائق تعيين موظف'' COL4,
COUNT(1) COL5,
''309'' COL6
FROM '||V_MainTable||'
WHERE INDOCNO > ''0'' AND
NUM_FIELD1 IN (0,1) AND
BAYAN_FLAG = ''0'' AND
ASSIGNTO_DEPT_NO = '''||V_ASSIGNTO_DEPT_NO||''' AND
ASSGNCNTCT_ID = '''||V_EMP_NO||''' AND
STATUS_ID IN (2) AND
DOCDATE BETWEEN
CASE
WHEN '||v_SQL||' = 1 THEN SYSDATE-30
WHEN '||v_SQL||' = 2 THEN SYSDATE-90
WHEN '||v_SQL||' = 3 THEN SYSDATE-365
END
AND
SYSDATE'
;
v_strSQL4 :=
'
SELECT 1 COL1,
4 COL2,
''Rejected Docs'' COL3,''قيود مرفوضة'' COL4,
COUNT(1) COL5,
''5504'' COL6
FROM '||V_MainTable||' A
JOIN OAEFILE_PROCESS_TYPE B ON A.PROCESS_ID = B.PROCESS_ID AND USERDEFINED01 = 7
WHERE INDOCNO > ''0'' AND
BAYAN_FLAG = ''0'' AND
STATUS_ID IN (2) AND
FCNTCT_ID IS NOT NULL AND
A.ASSIGNTO_DEPT_NO = '||V_ASSIGNTO_DEPT_NO||' AND
A.ASSGNCNTCT_ID = '||V_EMP_NO||' AND
DOCDATE BETWEEN
CASE
WHEN '||v_SQL||' = 1 THEN SYSDATE-30
WHEN '||v_SQL||' = 2 THEN SYSDATE-90
WHEN '||v_SQL||' = 3 THEN SYSDATE-365
END
AND
SYSDATE';
v_strSQL5 :=
'
SELECT 1 COL1,
5 COL2,
''Late Documents'' COL3,''Late Documents'' COL4,
COUNT(1) COL5,
''314'' COL6
FROM '||V_MainTable||' A
LEFT OUTER JOIN OAEFILE_DOC_SOURCE_TYPE G
ON A.DOC_ORIGN_SOURCE = G.DOC_SOURCE_ID AND
G.CABINETID = '||v_CabID1||'
WHERE INDOCNO > ''0'' AND
TO_CHAR(A.REMIND_DATE,''YYYY.MM.DD'')<= TO_CHAR(SYSDATE,''YYYY.MM.DD'') AND
A.STATUS_ID IN (2) AND
A.OUTDOCNO = ''0'' AND
A.ASSIGNTO_DEPT_NO = '||V_ASSIGNTO_DEPT_NO||' AND
A.ASSGNCNTCT_ID = '||V_EMP_NO||' AND
A.NUM_FIELD1 IN(0) AND
FCNTCT_ID IS NOT NULL AND
DOCDATE BETWEEN
CASE
WHEN '||v_SQL||' = 1 THEN SYSDATE-30
WHEN '||v_SQL||' = 2 THEN SYSDATE-90
WHEN '||v_SQL||' = 3 THEN SYSDATE-365
END
AND
SYSDATE'
;
v_strSQL6 :=
'
SELECT 1 COL1,
6 COL2,
''About to get Late Documents'' COL3,
''About to get Late Documents'' COL4,
COUNT(1) COL5,
''314'' COL6
FROM '||V_MainTable||' A
LEFT OUTER JOIN OAEFILE_DOC_SOURCE_TYPE G
ON A.DOC_ORIGN_SOURCE = G.DOC_SOURCE_ID AND
G.CABINETID = '||v_CabID1||'
WHERE INDOCNO > ''0'' AND
trunc(SYSDATE) - A.REMIND_DATE = 1 AND
A.STATUS_ID IN (2) AND
A.OUTDOCNO = ''0'' AND
A.ASSIGNTO_DEPT_NO = '||V_ASSIGNTO_DEPT_NO||' AND
A.ASSGNCNTCT_ID = '||V_EMP_NO||' AND
A.NUM_FIELD1 IN (0) AND
FCNTCT_ID IS NOT NULL AND DOCDATE BETWEEN
CASE
WHEN '||v_SQL||' = 1 THEN SYSDATE-30
WHEN '||v_SQL||' = 2 THEN SYSDATE-90
WHEN '||v_SQL||' = 3 THEN SYSDATE-365
END
AND
SYSDATE'
;
v_strSQL := v_strSQL1||' UNION ALL '||v_strSQL2||' UNION ALL '||v_strSQL3||' UNION ALL '||v_strSQL4||' UNION ALL '||v_strSQL5||' UNION ALL '||v_strSQL6;
open tbl_cur for v_strSQL;
END;
ORA-01031:权限不足您是否尝试调试该语句,例如dbms_output.put_linev_strSQL,并检查它或尝试手动运行它?您是否对所有涉及的表都有权限,特别是那些仅在后面的联合子句(如OAEFILE_PROCESS_TYPE)中的表,直接授予过程所有者(而不是通过角色)权限?是的,在脚本的最终生成时,我确实调试了该语句,所有的联合都执行得很好,问题是只有当执行到达时。为v_strSQL打开tbl_cur;是的,如果您可以直接在SQL中运行生成的语句,那么我对我在此代码中使用的所有对象都有权限,但从过程中运行时会出现错误,这表明您拥有通过角色授予的权限。从您上次的评论来看,我不确定您是否只是检查了一下它的外观,或者确实尝试过运行它。