我试图在存储过程中使用CLOB
数据类型作为输出参数,因为其结果集超过了var
数据类型的存储容量。
如何执行该程序?以下是我执行的命令。
我尝试使用CLOB
查询将结果集分配给INTO
变量,如查询中所示。
var cl CLOB;
EXECUTE procedure_name(:cl);
print cl;
我如何声明绑定变量,因为如果您看第一个命令,我首先将cl
初始化为var,因为发出错误,所以无法将其初始化为CLOB。
这是我的过程的一个示例。该过程中的实际查询长度为700行。
CREATE OR REPLACE PROCEDURE procedure_name (cl OUT CLOB)
IS
BEGIN OPEN cl FOR
SELECT * FROM .....
statement 1
.
.
.
.
.
statement n
INTO cl
FROM
statement 1
.
.
.
statement n
EXCEPTION
WHEN
OTHERS THEN
DECLARE
err_num NUMBER := SQLCODE;
err_msg VARCHAR2(512) := SQLERRM;
error_id_pk NUMBER;
error_dt DATE;
BEGIN
SELECT (REGEXP_REPLACE(CURRENT_TIMESTAMP, '[^0-9]+', ''))INTO error_id_pk FROM DUAL;
SELECT SYSDATE INTO error_dt FROM DUAL;
INSERT INTO ODS_CONTROL.ERROR_DETAILS(ERROR_ID, ERROR_CODE, ERROR_DATE, PROCEDURE_NAME, ERROR_MSG)
VALUES ( error_id_pk,
err_num,
error_dt,
'PRC_FLEXI_CARD',
err_msg
);
END;
END;
错误消息:
Error starting at line : 2 in command -
EXECUTE procedure_name( :clb )
Error report -
ORA-06550: line 1, column 7:
PLS-00905: object procedure_name is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
答案 0 :(得分:1)
[TL; DR] VAR
是用于声明变量的关键字,它不是数据类型;您的实际错误是由于在尝试定义过程而未编译时使用了无效的语法。
VAR
是VARIABLE
的缩写,定义了一个PL / SQL绑定变量。
此声明具有syntax:
VAR[IABLE] [variable [type] ]
其中type表示以下之一:
NUMBER CHAR CHAR (n [CHAR | BYTE]) NCHAR NCHAR (n) VARCHAR2 (n [CHAR | BYTE]) NVARCHAR2 (n) BLOB BFILE CLOB NCLOB REFCURSOR BINARY_FLOAT BINARY_DOUBLE
所以:
var cl CLOB;
您正在使用VAR
关键字声明一个变量,该变量名为cl
,类型为CLOB
。
此外,您的CREATE PROCEDURE
语句存在语法错误,因为您不能在过程名称周围加上单引号。例如:
CREATE PROCEDURE procedure_name (clb OUT CLOB)
IS
BEGIN
clb := 'test';
END;
/
然后:
VAR cl CLOB;
EXECUTE procedure_name( :cl );
PRINT cl;
输出:
test
已更新:
Oracle 11g R2架构设置:
CREATE TABLE ERROR_DETAILS(
ERROR_ID NUMBER,
ERROR_CODE NUMBER,
ERROR_DATE DATE,
PROCEDURE_NAME VARCHAR2(30),
ERROR_MSG VARCHAR2(512)
)
/
CREATE PROCEDURE procedure_name (cl OUT CLOB)
IS
BEGIN
SELECT DUMMY
INTO cl
FROM dual
WHERE ROWNUM = 1;
EXCEPTION
WHEN
OTHERS THEN
DECLARE
err_num NUMBER := SQLCODE;
err_msg VARCHAR2(512) := SQLERRM;
BEGIN
INSERT INTO /* ODS_CONTROL. */ ERROR_DETAILS(
ERROR_ID,
ERROR_CODE,
ERROR_DATE,
PROCEDURE_NAME,
ERROR_MSG
) VALUES (
TO_NUMBER( TO_CHAR( CURRENT_TIMESTAMP, 'YYYYMMDDHH24MISSFF9' ) ),
err_num,
SYSDATE,
'PRC_FLEXI_CARD',
err_msg
);
END;
END;
/
查询1 :
SELECT * FROM USER_ERRORS
Results :
No rows selected