Oracle PL / SQL在游标中创建表?

时间:2015-02-26 16:38:32

标签: oracle plsql

我对PL / SQL比较新,所以请耐心等待。 我创建了两个将在FOR循环游标中使用的表。我的目的是在开始时(在游标循环之前)创建这两个表,每当我需要它清除并插入新值时,在游标循环内截断它们,然后在游标循环完成后将它们删除。 (看了一下SO之后,我认为这可以用REF CURSOR完成,但我不清楚如何使用它,所以我决定继续第一种方法。)

我尝试在DECLARE部分创建表,然后在循环开始之前在BEGIN部分创建表,但它引发错误' ORA-065500和PLS-00103在期望开始函数编译指示时遇到符号CREATE。 。' 请注意,我在LOOP结束后但在光标的END部分之前删除表。

我应该在DECLARE部分之前创建光标之外的表,并在光标END部分之后删除它们吗?我认为应该可以在游标中创建永久的oracle表吗?

更新:在此处发布代码 -

1)

DECLARE
  CREATE TABLE T1
    (
      col1 VARCHAR2(128),
      col2  VARCHAR2(128),
      col3 NUMBER(3) NOT NULL,
      col3 FLOAT(100)
    );

  CREATE TABLE T2 AS
  SELECT * FROM other_table WHERE 1 = 0;

CURSOR CUR IS ...
BEGIN

       FOR rec IN CUR
       LOOP
       --Do stuff here
         END LOOP;

Drop table T1;
Drop table T2;
END;
/

2)

DECLARE

CURSOR CUR IS ...
BEGIN

  CREATE TABLE T1
    (
      col1 VARCHAR2(128),
      col2  VARCHAR2(128),
      col3 NUMBER(3) NOT NULL,
      col3 FLOAT(100)
    );

  CREATE TABLE T2 AS
  SELECT * FROM other_table WHERE 1 = 0;

  FOR rec IN CUR
  LOOP
  --Do stuff here
  END LOOP;

  Drop table T1;
  Drop table T2;
END;
/

(1)和(2)都不能工作。

更新 - 我们需要EXECUTE IMMEDIATE吗?我怎么知道什么时候需要EXECUTE IMMEDIATE?我们还需要EXECUTE IMMEDIATE来截断游标中的表吗?

1 个答案:

答案 0 :(得分:3)

通常,您不会在PL / SQL过程中执行DDL(创建,更改,删除)。如果您需要一个表来存储一些临时数据,可以为此创建temporary tables。在你的情况下,我会先创建表

CREATE GLOBAL TEMPORARY TABLE T1
  (
    col1 VARCHAR2(128),
    col2  VARCHAR2(128),
    col3 NUMBER(3) NOT NULL,
    col3 FLOAT(100)
  );

CREATE GLOBAL TEMPORARY TABLE T2 AS
SELECT * FROM other_table WHERE 1 = 0;

然后程序看起来像这样

DECLARE
CURSOR CUR IS ...
BEGIN
       FOR rec IN CUR
       LOOP
       --Do stuff here
         END LOOP;

DELETE FROM T1;
DELETE FROM T2;
END;
/

当然这些表在此之后不会被删除,但我想你想定期使用你的PL / SQL程序,不仅一次,对吗?

如果您仍希望在程序中执行DDL,则必须使用dynamic sql(立即执行)。但是,您必须知道DDL操作执行隐式提交,因此您的过程不会是单个原子事务。