oracle - 哪种数据类型支持更多的字符串/字符然后 CLOB
问题描述
目前我使用 CLOB 来存储 all_objects 的存储过程的定义,但是一些过程长度很长,因此使用 Excute Immediate 执行非常困难,因为它使用 CLOB 跨越长度
ORA-06502: PL/SQL: numeric or value error 06502. 00000 - "PL/SQL: numeric or value error%s" *原因:出现算术、数字、字符串、转换或约束错误。例如,如果尝试将值 NULL 分配给声明为 NOT NULL 的变量,或者尝试将大于 99 的整数分配给声明为 NUMBER(2) 的变量,则会发生此错误。*行动:改变数据,如何操作,或如何声明,使值不违反约束。
DECLARE
v_output CLOB := NULL;
a CLOB := NULL;
srce VARCHAR2(1000) := NULL;
BEGIN
-- Note,we don't search for package bodies. We will extract the body
-- along with the package spec.
dbms_output.put_line('Database DDL For Selected Objects Report');
FOR dd IN (
SELECT
object_name,
status
FROM
all_objects
WHERE
status != 'VALID'
AND
object_name LIKE '%SP_RPT%'
) LOOP
a := '';
srce := dd.object_name;
dbms_output.put_line(srce || ' proceudure creation start');
FOR dd1 IN (
SELECT
text
FROM
dba_source
WHERE
type = 'PROCEDURE'
AND
name LIKE dd.object_name
) LOOP
-- DBMS_OUTPUT.put_line (dd1.text);
a := a || dd1.text;
-- DBMS_OUTPUT.put_line (a);
END LOOP;
dbms_output.put_line(a);
-- EXECUTE IMMEDIATE a ;
dbms_output.put_line(srce || ' proceudure Updated successfully');
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('ERROR occured while creating Procedure ' || srce);
dbms_output.put_line(a);
dbms_output.put_line(substr(
dbms_utility.format_error_stack
|| ' ,'
|| dbms_utility.format_error_backtrace,
1,
500
) );
RAISE;
END;
解决方案
execute_immediate_statement
dynamic_sql_stmt
表示 SQL 语句的字符串文字、字符串变量或字符串表达式。它的类型必须是 CHAR、VARCHAR2 或 CLOB。
参考:https ://docs.oracle.com/database/121/LNPLS/executeimmediate_statement.htm#LNPLS01317
此外,有关数据类型大小和用法的更多信息,请参阅:https ://sqljana.wordpress.com/2017/02/07/oracle-clob-vs-varchar2-when-when-not-to-use/
我建议 CLOB 在你的情况下是一个更好的选择。
推荐阅读
- java - 在hackerrank中的美丽二进制字符串中出现错误
- c++ - 局部变量的C++浮点值解释?
- python - 为什么我可以添加元组,但不能减去?
- wordpress - Wordpress:允许贡献者编辑其他帖子并适度发布
- hibernate - JPA Hibernate EnableJpaAuditing isUpdateNecessary
- javascript - JavaScript Error: Uncaught TypeError: Cannot set property 'value' of null
- html - 导出为 PDF 时,表格中每一页的结尾行缺少边框底部
- java - OutOfMemoryError:Java 堆空间和 CPU 使用率 100%
- c# - Azure Functions OAuth2 来自存储在数据库中的电子邮件/密码?
- android - 适用于 Android API 16 至 18 的 GCMParameterSpec 或类似版本