0

以下过程编译成功。但是,当我尝试运行它时出现错误。

CREATE OR REPLACE PROCEDURE SAMPLE_PROCEDURE 
AS
VARIABLE1 VARCHAR2(2000);
BEGIN
VARIABLE1:='DECLARE A TIMESTAMP:=LOCALTIMESTAMP; 
CREATE GLOBAL TEMPORARY TABLE TEMP_BWXROW
   (ROW_ID NUMBER(10),DIVISION VARCHAR2(256),OUTLET VARCHAR2(256),CLASS VARCHAR2(256));';

EXECUTE IMMEDIATE VARIABLE1;
END;

错误是:

6550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

你能帮我吗,这有什么问题。

4

2 回答 2

0

这样做的问题是,您几乎可以肯定不应该在运行时创建表,并且您几乎可以肯定不应该使用动态 PL/SQL,而且您真的,真的,真的不应该在动态 PL 中动态创建表/SQL 块。

如果您绝对决定这样做,则CREATE TABLE语句本身需要在动态 PL/SQL 块内使用动态 SQL。如果我的所有引号都正确转义,你最终会得到这样的结果

CREATE OR REPLACE PROCEDURE SAMPLE_PROCEDURE 
AS
  VARIABLE1 VARCHAR2(2000);
BEGIN
  VARIABLE1:='DECLARE 
                A TIMESTAMP:=LOCALTIMESTAMP; 
              BEGIN
                EXECUTE IMMEDIATE ''CREATE GLOBAL TEMPORARY TABLE TEMP_BWXROW
                                    (ROW_ID NUMBER(10),
                                     DIVISION VARCHAR2(256),
                                     OUTLET VARCHAR2(256),
                                     CLASS VARCHAR2(256))'';
              END;';

  EXECUTE IMMEDIATE VARIABLE1;
END;

但是,如果我在我的一个系统中遇到这样的一段代码,我会与原始开发人员进行一次措辞非常强硬的对话,以了解是什么让他们相信任何问题都需要 PL/SQL 执行动态 PL/SQL本身执行动态 SQL 语句的块。

于 2013-04-10T18:08:43.293 回答
0

动态创建全局临时表很奇怪。无论如何,我认为这都是学习练习的一部分......

尝试这个:

CREATE OR REPLACE PROCEDURE SAMPLE_PROCEDURE 
AS
  VARIABLE1 VARCHAR2(2000);
BEGIN
  VARIABLE1:='DECLARE A TIMESTAMP:=LOCALTIMESTAMP; 
              BEGIN
              CREATE GLOBAL TEMPORARY TABLE TEMP_BWXROW
                (ROW_ID NUMBER(10),
                 DIVISION VARCHAR2(256),
                 OUTLET VARCHAR2(256),
                 CLASS VARCHAR2(256));
              END';

  EXECUTE IMMEDIATE VARIABLE1;
END;
于 2013-04-10T18:02:31.150 回答