2

这是您从 Oracle 收到无用错误消息的情况之一。

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

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

ORA-00907: missing right parenthesis error. 

在 TOAD 中手动创建视图(没有 EXECUTE IMMEDIATE)没有问题。我的感觉是字符串的长度是这里的一个因素,因为我已经成功地创建了具有较短字符串的视图(并且还使用 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;
4

1 回答 1

4

正如 Klas 所说,您应该能够将 VARCHAR2(32767) 用于变量声明,但如果您发现这还不够,您可以使用多个 VARCHAR2 变量来保存视图语句的各个部分,然后将它们发布到 EXECUTE IMMEDIATE 语句。

此处的 AskTom 回答展示了:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6161200355268

说:

您已指出立即执行的最大字符串长度为 32K。

我们正在使用 execute immediate 来创建生成的包,我们目前正在传递 > 35000 个字符

通过立即执行 v_myvc1 || 我的_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 过程成功完成。

虽然这是在 Oracle 8i 数据库实例上,但如果在以后的版本中删除了菊花链 VARCHAR2 变量的能力,我会感到非常惊讶。不幸的是,我无法对其进行测试,因为我目前没有可用的 10g 实例。

于 2011-10-03T13:58:37.900 回答