首页 文章

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

提问于
浏览
0

我对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 回答

  • 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操作执行隐式提交,因此您的过程不会是单个原子事务 .

相关问题