2010-12-21 41 views
2

我想提到我是新的使用SQL开发人员,我试图用两个变量中找到的两个值填充临时表,但我无法修正它。我希望你们中的一个人能有更好的主意。 这是我已经试过:在oracle中的变量遇到问题SQL开发人员

DECLARE 
    x NUMBER; 
    y NUMBER; 
BEGIN 
EXEC SELECT COUNT(*) INTO :x FROM (select * from view2 where restituita=1); 
EXEC SELECT COUNT(*) INTO :y FROM (select * from view2 where restituita=0); 
create global temporary table dateRest (rest number,nerest number); 
insert into dateRest values(x,y); 
select * from dateRest; 
END; 

回答

3

根据最终的结果,查询是过于复杂 - 它仅需要:

SELECT SUM(CASE WHEN restituita = 1 THEN 1 ELSE 0 END), 
     SUM(CASE WHEN restituita = 0 THEN 1 ELSE 0 END) 
    FROM view2; 
+0

我怀疑这会工作。我甚至怀疑这三个语句中的任何一个都可以在PL/SQL块中使用。 – Codo 2010-12-21 18:14:49

0

你应该失去:的范围内(匿名)过程的参数。

不,我错了。当您不使用EXEC时,不需要:。我认为你的问题在于创建表格。这是不可能的,因为PLSQL不支持CREATE TABLE语句。您应该使用:

EXECUTE IMMEDIATE 'CREATE TABLE ....'; 
3

恐怕你有更多的错误和问题比你的代码段中的行更多。它是SQL语句,PL/SQL和其他语言的变量绑定的混合体。

由于您使用了声明/开始/结束块,因此您处于PL/SQL环境中。在PL/SQL世界:

  • 不能使用EXEC,因为它是一个短手开始/结束如果你在PL/SQL不是。
  • 你并不需要使用冒号的变量绑定
  • 不能执行SELECT语句没有把结果某处
  • 您不能执行DDL语句(CREATE TABLE ...)直接。
  • 通常您不能参考块启动时开始/结束时不存在的表。

并且不要忘记提交。

所以解决方案可能是:不要使用PL/SQL。

create global temporary table dateRest (rest number,nerest number); 
insert into dateRest(x, y) 
    select (select count(*) from view2 where restituita=1), 
    (select count(*) from view2 where restituita=0) 
    from dual; 
commit; 
0

修正OMG匿名块是:

DECLARE 
    var1 Number; 
    var2 Number; 
BEGIN 
SELECT SUM(CASE WHEN restituita = 1 THEN 1 ELSE 0 END), 
    SUM(CASE WHEN restituita = 0 THEN 1 ELSE 0 END) 
    INTO var1, var2 
FROM view2; 

END;