2010-12-21 39 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;