Plsql 使用CLOB输出调用存储过程
我试图在存储过程中使用Plsql 使用CLOB输出调用存储过程,plsql,oracle11g,Plsql,Oracle11g,我试图在存储过程中使用CLOB数据类型作为输出参数,因为其结果集超过了var数据类型的存储容量。 如何执行该过程?下面是我执行的命令 我尝试使用INTO查询将resultset分配给CLOB变量,如查询中所示 var-cl-CLOB; 执行程序名称(:cl); 打印cl 我如何声明绑定变量,因为如果查看第一个命令,我首先将cl初始化为var,因为它发出错误,所以我无法将其初始化为CLOB 这是我的程序示例。过程中的实际查询有700行长 创建或替换过程名称(cl OUT CLOB) 是 开始为客
CLOB
数据类型作为输出参数,因为其结果集超过了var
数据类型的存储容量。
如何执行该过程?下面是我执行的命令
我尝试使用INTO
查询将resultset分配给CLOB
变量,如查询中所示
var-cl-CLOB;
执行程序名称(:cl);
打印cl代码>
我如何声明绑定变量,因为如果查看第一个命令,我首先将cl
初始化为var,因为它发出错误,所以我无法将其初始化为CLOB
这是我的程序示例。过程中的实际查询有700行长
创建或替换过程名称(cl OUT CLOB)
是
开始为客户打开cl
从…中选择*。。。。。
报表1
.
.
.
.
.
声明
进入cl
从…起
报表1
.
.
.
声明
例外情况
什么时候
那么其他人呢
声明
err_num NUMBER:=SQLCODE;
err_msg VARCHAR2(512):=SQLERRM;
错误\标识\主键号;
错误日期;
开始
从DUAL中选择(REGEXP_REPLACE(当前_时间戳,[^0-9]+','')到error_id_pk中;
从DUAL中选择SYSDATE INTO error_dt;
插入ODS_控件。错误详细信息(错误ID、错误代码、错误日期、过程名称、错误消息)
值(错误\u id\u pk,
嗯!,
误差_dt,
“中国灵活卡”,
错误消息
);
结束;
结束
[TL;DR]VAR
是用于声明变量的关键字,不是数据类型;您的实际错误是由于在尝试定义过程时使用了无效语法,但该过程尚未编译
VAR
是VARIABLE
的缩写,定义了PL/SQL绑定变量
本宣言具有以下特点:
其中,类型表示以下内容之一:
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;
/
然后:
产出:
test
已更新:
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;
/
SELECT * FROM USER_ERRORS
No rows selected
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;
/
SELECT * FROM USER_ERRORS
No rows selected
查询1:
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;
/
SELECT * FROM USER_ERRORS
No rows selected
:
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;
/
SELECT * FROM USER_ERRORS
No rows selected
谢谢你的回复。但我无法使用命令执行。我收到以下错误:PLS-00905:object'procedure\u name'无效
@gauravthanthry请在您的评论之前查看我的更新。下一次,在你的问题中发布完整的错误信息,因为你的问题做出了很多假设,认为什么是错误的-没有一个是问题或与你正在经历的错误相关。嗨@MT0,我没有在我的代码中使用引号。只是因为我不能把实际的过程名放在这里,所以我用引号把它括起来。我仍然无法执行它。@GauravThantry请用一个包含不起作用的代码的命令更新您的问题。。。如果您无法做到这一点,那么我们将无法帮助您,因为我们无法看到问题。解决方案是,您需要调试您的过程,以便它能够编译,但是您需要采取的中间步骤是未知的,因为您没有分享您的问题。Hi MT0抱歉,我不愿意添加实际代码,因为它对我的公司是机密的。无论如何,我已经添加了一个示例代码。请告诉我可以做什么。“这是一个错误”。请包含完整的错误消息(因为您的错误与var
变量声明无关)。