【问题标题】:Temporary table in oracle11g and select multiple rowsoracle11g中的临时表并选择多行
【发布时间】:2015-03-12 08:03:07
【问题描述】:

在我的 oracle 存储过程中,我需要创建临时表。我想根据一些逻辑在临时表中插入行并从存储过程中返回这些行。

我的数据库在 oracle 11G 中。我正在使用 oracle sql developer 创建存储过程。

尝试获取多行时出现以下错误。

错误(6,4):PLS-00428:此 SELECT 语句中应有一个 INTO 子句

CREATE OR REPLACE PROCEDURE TestStoredP AS 
 stmt varchar2(1000);

BEGIN  

  select emp_id,empname INTO AAA,BBB from EMPLOYEE;

   stmt := 'create global temporary table temp(id number(10))';

   EXECUTE IMMEDIATE stmt;  

   stmt := 'insert into temp values(1)';   
   EXECUTE IMMEDIATE stmt;  

   stmt := 'select * from temp';   
   EXECUTE IMMEDIATE stmt;  

   execute immediate ' drop table temp'; 

END TOPS; 

请建议如何实施。

【问题讨论】:

  • 该错误与临时表无关;正如错误所示,您的动态选择没有 into 子句。您不应在过程中创建表(或通常执行任何 DDL)。如果您确实需要临时存储临时结果或 SQL 类型,则可以使用 PL/SQL 集合,具体取决于您想要“返回”的内容和方式。您没有输出参数,而且您通常会从函数而不是过程返回数据,因此不清楚您真正需要什么。
  • This might be useful too,如果您来自另一个使用临时表的 DBMS;您可能还会找到合适的pipelined function。但这取决于你真正在做什么。

标签: oracle plsql oracle11g


【解决方案1】:

使用全局临时表

create global temporary table temp_foo(id number(10));

您插入到临时表中的值仅在插入它们的会话中可见。

那么程序就变成了:

CREATE OR REPLACE PROCEDURE TestStoredP AS 

    val number(10);
    aaa emp.emp_id%type;
    bbb emp.empname%type;
BEGIN  

    select emp_id,empname INTO AAA,BBB from EMPLOYEE;

    insert into temp_foo values(1);

    select id into val from temp_foo;

END TOPS; 

现在,您得到的错误 (PLS-00428: an INTO clause is expected in this SELECT statement) 与您的临时表无关。在存储过程中,当您选择一个值时,您需要告诉您要选择哪些变量。这是通过into 子句完成的。

【讨论】:

  • 那么我必须在哪里编写脚本来创建临时表?存储过程之前?如果我编写脚本在 SP 之外创建临时表,那么当我从我的 c# 代码执行 SP 时它会自动创建吗?
  • 您在存储过程之外创建了一次临时表,是的。然后它将可用。还要确保您了解on commit delete rows(默认)和om commit preserve rows之间的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多