【问题标题】:Creating table before creating a cursor in Oracle在Oracle中创建游标之前创建表
【发布时间】:2011-12-25 09:11:59
【问题描述】:

我有一个 PL/SQL 过程,它创建一个临时表,然后使用游标从这个临时表中提取数据,处理数据,然后删除临时表。但是,如果数据库中不存在该表,Oracle 不允许使用游标。

请帮我处理一下。

【问题讨论】:

  • 为什么要创建然后删除临时表,而不是创建一次,然后一遍又一遍地使用它们? -- 如果您来自 SQL Server 背景,Oracle 就不同了。临时表是保存临时数据的永久对象。

标签: oracle plsql oracle10g temp-tables


【解决方案1】:

你的说法不太正确。您可以使用游标进行几乎任意查询。见下文:

create or replace procedure fooproc
IS
    type acursor is ref cursor;
    mycur  acursor;
    mydate date;
BEGIN
    execute immediate 'create global temporary table footmp (bar date) on commit delete rows';
    execute immediate 'insert into footmp values (SYSDATE)';
    open mycur for 'select * from footmp';
    loop
        fetch mycur into mydate;
        exit when mycur%notfound;
        dbms_output.put_line(mydate);
    end loop;
    close mycur;
    execute immediate 'drop table footmp';
END fooproc;
/

(更多细节here - 特别是这个简短的过程根本不安全,因为表名是固定的并且不依赖于会话)。

它(相当)有点难看,我不建议您使用它 - 相反,您应该考虑是否需要该过程特定的临时表。

this other article:

请勿动态创建它们 [临时表],请勿动态创建它们,请不要动态创建它们。

您不能使用全局临时表吗?你真的需要一个临时表吗? (即,不在用于填充该表格的 select 语句上使用光标?)

【讨论】:

    【解决方案2】:

    或者,如果您希望避免全局临时表和您可能习惯的“常规”永久表之间的差异(请参阅Oracle docs 关于临时表数据可用性、生命周期等),只需先创建表(不记录)。假设没有其他人在使用此表,您的过程可能会在处理之前/之后截断。

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多