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
变量声明无关)。