【问题标题】:Having trouble with variables in oracle sql developeroracle sql developer中的变量有问题
【发布时间】:2010-12-21 17:53:44
【问题描述】:

我想提一下,我是使用 sql developer 的新手,我正在尝试用两个变量中的两个值填充一个临时表,但我无法正确处理。我希望你们中的一个人可以有一个更好的主意。 这是我尝试过的:

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;

【问题讨论】:

    标签: sql oracle plsql aggregate-functions


    【解决方案1】:

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

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

    【讨论】:

    • 我怀疑这会奏效。我什至怀疑这三个语句中的任何一个都可以在 PL/SQL 块中工作。
    • 同意科多。你必须在 PL/SQL 中有一个 SELECT 的目的地。如果 SQL 返回一行且仅返回一行,则必须将选择打开为游标,或者使用 INTO 变量。
    • 错误报告:ORA-06550:第 3 行,第 3 列:PLS-00428:此 SELECT 语句 06550 中需要一个 INTO 子句。00000 -“第 %s 行,第 %s 列:\n% s" *原因:通常是 PL/SQL 编译错误。 *行动:
    • 肯定 OMG 正在替换整个匿名块,而不仅仅是其中的选择?假设 dateRest 只是为此创建的,实际上不需要存在于其他地方。
    【解决方案2】:

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

    由于您使用了 declare/begin/end 块,因此您进入了 PL/SQL 世界。在 PL/SQL 世界中:

    • 您不能使用 EXEC,因为如果您不在 PL/SQL 中,它是 begin/end 的简写。
    • 变量绑定不需要使用冒号
    • 您不能执行 SELECT 语句而不将结果放在某处
    • 您不能直接执行 DDL 语句 (CREATE TABLE...)。
    • 您通常不能在 begin/end 块启动时引用不存在的表。

    别忘了提交。

    所以解决方案可能是:不要使用 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;
    

    【讨论】:

      【解决方案3】:

      对于(匿名)过程中的参数,您应该丢失 :

      [编辑]

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

      EXECUTE IMMEDIATE 'CREATE TABLE ....';
      

      【讨论】:

        【解决方案4】:

        更正后的 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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-29
          • 2011-08-04
          • 1970-01-01
          相关资源
          最近更新 更多