在oracle sql developer中遇到变量问题

时间:2010-12-21 17:53:45

标签: sql oracle plsql aggregate-functions

我想提一下,我是新用的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;

4 个答案:

答案 0 :(得分:3)

根据最终结果,查询过于复杂 - 只需要:

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

答案 1 :(得分:3)

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

由于您使用 declare / begin / end 块,因此您处于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;

答案 2 :(得分:0)

您应该在(匿名)程序中丢失:参数。

[编辑]

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

EXECUTE IMMEDIATE 'CREATE TABLE ....';

答案 3 :(得分: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;