Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle ORA-00907在PL/SQL中动态创建视图并使用CLOB时_Oracle_Plsql_Oracle10g_Ora 00907 - Fatal编程技术网

Oracle ORA-00907在PL/SQL中动态创建视图并使用CLOB时

Oracle ORA-00907在PL/SQL中动态创建视图并使用CLOB时,oracle,plsql,oracle10g,ora-00907,Oracle,Plsql,Oracle10g,Ora 00907,在这种情况下,您会从Oracle收到一条无用的错误消息 我的情况如下:我正在PL/SQL中动态创建一个视图。我构建一个字符串并使用executeimmediate创建视图。字符串太长了,我用CLOB来存储它 当我在TOAD中运行下面的代码时,我得到了无用的结果 ORA-00907: missing right parenthesis error. 在TOAD中手动创建视图(不使用executeimmediate)不会出现任何问题。我的感觉是字符串的长度是这里的一个因素,因为我已经成功地创建了

在这种情况下,您会从Oracle收到一条无用的错误消息

我的情况如下:我正在PL/SQL中动态创建一个视图。我构建一个字符串并使用executeimmediate创建视图。字符串太长了,我用CLOB来存储它

当我在TOAD中运行下面的代码时,我得到了无用的结果

ORA-00907: missing right parenthesis error. 
在TOAD中手动创建视图(不使用executeimmediate)不会出现任何问题。我的感觉是字符串的长度是这里的一个因素,因为我已经成功地创建了具有较短字符串的视图(并且使用to_char()代替dbms_lob.substr(),但是to_char()只适用于较小的clob)

字符串的总长度为13775。(显然我已经编辑了下面构建字符串的那一行。)这是Linux上的Oracle 10g数据库

declare
lv_sql CLOB;

begin
lv_sql := ' CREATE OR REPLACE FORCE VIEW my_view.....';

EXECUTE IMMEDIATE dbms_lob.substr(lv_sql, 14765, 1 );    
end;

正如Klas所说,您应该能够使用VARCHAR2(32767)进行变量声明,但是如果您发现这还不够,您可以使用多个VARCHAR2变量来保存view语句的各个部分,然后将它们发送给executeimmediate语句

这里的AskTom回答说明:

说:

您已指示execute immediate的最大字符串长度 是32K

我们正在使用executeimmediate创建生成的包,并且 目前超过35000个字符

通过立即执行v|u myvc1 | my|u vc2

vc1和vc2是32 k varchar2 VAR。其组合长度当前为

35000

全部在8.1.7上

我的问题是执行立即数的最大长度是多少 因为我担心它是32k,我们已经结束了,而且 我不确定我什么时候会撞到墙

汤姆·凯特回答说:

跟进2003年3月5日至下午6时中央时区:

有趣的是,我从来没有想过要这样做

这似乎有效——它会撞到墙吗?不确定,我永远不会 已经超过32k了

看起来它可以变得相当大:

ops$tkyte@ORA817DEV> declare   
2          l_str1 long := 'select /* ' || rpad( '*', 20000, '*' ) || ' */ * '; 
3          l_str2 long := 'from /* '   || rpad( '*', 15000, '*' ) || ' */ dual';
4          l_str3 long := '/* '   || rpad( '*', 32000, '*' ) || ' */ ';   
5          l_result dual.dummy%type;   
6  begin   
7          execute immediate l_str1||l_str2||l_str3||l_str3||l_str3||' d' into l_result; 
8          dbms_output.put_line( l_result );   
9  end;  
10  / 
PL/SQL过程已成功完成


虽然这是在Oracle8i数据库实例上实现的,但如果在以后的版本中放弃了对VARCHAR2变量进行菊花链的功能,我会非常惊讶。不幸的是,我无法测试它,因为目前我手头没有10g实例。

您应该能够使用varchar2,它们在pl/sql中最多可以有32767个字节。@KlasLindbäck-谢谢您的评论。我已经试过了,但是我得到了一个“ORA-06502:PL/SQL:numeric or value error”错误。非常感谢您的回答。但是我已经试过了,但是我得到了一个“ORA-06502:PL/SQL:numeric or value error”错误,这就是我切换到CLOB的原因。在使用VARCHAR2变量时是否使用了SUBSTR?不,只执行立即lv_SQL;我想知道执行立即执行是否会进行某种上下文切换,从而使32k的PL/SQL限制不再适用?AskTom Q&A建议不适用(也可以使用执行立即执行来执行动态PL/SQL)。您可以发布您试图运行以获取错误的确切SQL吗?请尝试将多个VARCHAR2(32767)变量以菊花链方式链接在一起,看看是否有效,您可能正在使用每个字符使用多个字节的字符集。