oracle 存储过程里用 execute immedate 动态sql,更新一个表的clob字段报字符长度

oracle 存储过程里用 execute immedate 动态sql,更新一个表的clob字段报字符长度,第1张

sql里面varchar2最多4000个字节,sql语句最多32K长度,估计是你的a_clob太长,放到sql里面超过这个限制了,具体是哪个原因还得你自己测试。

可以使用绑定变量的方式来做。

V_SQL := 'UPDATE B '|| ' SET B_CLOB = ''' || AA.A_CLOB ||''' WHERE B_KEY = '''|| AA.A_KEY || ''''

EXECUTE IMMEDIATE V_SQL

改成:

V_SQL := 'UPDATE B SET B_CLOB =:1 WHERE B_KEY =:2 '

EXECUTE IMMEDIATE V_SQL using AA.A_CLOB,AA.A_KEY

给你一个案例对这些,使用execute immediate就可以了,存储过程和语句块也是一样的,自己改一改,没区别的。

语法格式

EXECUTE IMMEDIATE dynamic_string

  [INTO {define_variable[, define_variable]... | record}]

  [USING [IN | OUT | IN OUT] bind_argument [, [IN | OUT | IN OUT] bind_argument]...]

  [{RETURNING | RETURN} INTO bind_argument[, bind_argument]...]

  

1,  *** 作 DDL语句,这也是动态 SQL的常用 *** 作之一

如下所示使用动态 SQL创建 数据库表:

DECLARE

  l_dync_sql VARCHAR2(100)

BEGIN

  l_dync_sql := 'CREATE TABLE cux_dync_test(id NUMBER, creation_date DATE)'

  EXECUTE IMMEDIATE l_dync_sql

END

2, *** 作 DML语句,使用 USING子句可以按照顺序将输入的值绑定到变量,如果动 态SQL只有单行输出的话可以直接使用 INTO来接收输出值,如下所示。

DECLARE

  l_dync_sql    VARCHAR2(100)

  l_person_name VARCHAR2(140)

  l_age         NUMBER

BEGIN

  l_dync_sql := 'SELECT person_name, age FROM cux_cursor_test WHERE person_id = :1'

  EXECUTE IMMEDIATE l_dync_sql

    INTO l_person_name, l_age -- 使用into语句接手动态SQL的输出,如果输出多行则出错

    USING 101 -- 给绑定变量赋值

  dbms_output.put_line('Person Name: ' || l_person_name)

  dbms_output.put_line('Age: ' || l_age)

END

第 章 动态SQL

为何使用动态SQL

实现动态SQL有两种方式 DBMS_SQL和本地动态SQL(EXECUTE IMMEIDATE)

主要从以下方面考虑使用哪种方式

      是否知道涉及的列数和类型

DBMS_SQL包括了一个可以 描述 结果集的存储过程(DBMS_SQL DESCRIBE_COLUMNS) 而本地动态SQL没有

      是否知道可能涉及的绑定变量数和类型

DBMS_SQL允许过程化的绑定语句的输入 而本地动态SQL需要在编译时确定

      是否使用 数组化 *** 作(Array Processing)

DBMS_SQL允许 而本地动态SQL基本不可以 但可以用其他方式实现(对查询可用FETCH BULK COLLECT INTO 对INSERT等 可用一个BEGIN … END块中加循环实现)

      是否在同一个会话中多次执行同一语句

DBMS_SQL可以分析一次执行多次 而本地动态SQL会在每次执行时进行软分析

      是否需要用REF CURSOR返回结果集

仅本地动态SQL可用REF CURSOR返回结果集

如何使用动态SQL

DBMS_SQL

      调用OPEN_CURSOR获得一个游标句柄

      调用PARSE分析语句 一个游标句柄可以用于多条不同的已分析语句 但一个时间点仅一条有效

      调用BIND_VARIABLE或BIND_ARRAY来提供语句的任何输入

      若是一个查询(SELECT语句) 调用DIFINE_COLUMN或DEFINE_ARRAY来告知Oracle如何返回结果

      调用EXECUTE执行语句

      若是一个查询 调用FETCH_ROWS来读取数据 可以使用COLUMN_VALUE从SELECT列表根据位置获得这些值

      否则 若是一个PL/SQL块或带有RETURN子句的DML语句 可以调用VARIABLE_VALUE从块中根据变量名获得OUT值

      调用CLOSE_CURSOR

注意这里对任何异常都应该处理 以关闭游标 防止泄露资源

本地动态SQL

EXECUTE IMMEDIATE 语句

[INTO {变量 变量 … 变量N | 记录体}]

[USING [IN | OUT | IN OUT] 绑定变量 … 绑定变量N]

[{RETURNING | RETURN} INTO 输出 [ … 输出N]…]

注意本地动态SQL仅支持弱类型REF CURSOR 即对于REF CURSOR 不支持BULK COLLECT

最后说明

lishixinzhi/Article/program/Oracle/201311/18948


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9908680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存