2017-11-18 84 views
0

下面的代碼返回錯誤ORA-00942: table or view does not exist,我想可能是因爲PL/SQL運行時引擎(或者我不知道是什麼)試圖將table_in作爲表處理,但是爲什麼會這樣做,我已經將table_in聲明爲變量。變量未被替換(學習動態PL/SQL)

ex26011601表存在與相同架構中的值。

set serveroutput on 

declare 
    function tabcount (table_in in varchar2) 
     return pls_integer 
    is 
     l_return pls_integer; 
    begin 
     select count(*) into l_return from table_in; 
     return l_return; 
    end; 
begin 
    dbms_output.put_line(tabcount('ex26011601')); 
end; 

我明白EXECUTE IMMEDIATE會解決這個目的。我試圖得到的是爲什麼現在的聲明有必要和什麼錯誤,即使在聲明中聲明'table_in'也不能被視爲變量。或者,爲什麼變量不在那裏?

+0

這是因爲你的SELECT語句的 –

+0

PL/SQL不只是胡亂替代恰好匹配任意文本參數名稱。在參數化遊標的上下文中,它只評估綁定變量。 –

回答

2

我明白EXECUTE IMMEDIATE會解決這個目的。我所 試圖得到的是爲什麼是必要的,什麼是錯與當前 聲明「table_in」不能爲變量,即使在 範圍被宣佈後處理。

作爲每Oracle文檔:Static SQL

PL/SQL靜態SQL語句可以具有PL/SQL標識符無論其SQL對方可以具有用於綁定變量的佔位符。在PL/SQL標識必須標識變量或正式parameter.To使用PL/SQL標識符的表名,列名,依此類推,使用EXECUTE IMMEDIATE語句

在PL/SQL,你需要動態SQL運行時:

  • SQL其文本是在編譯時

    例如,包括標識符是未知在編譯時(如表名)SELECT語句的或未知的 其中的一個WHERE子句的數量子句在編譯時是未知的。不支持靜態SQL

  • SQL

Dynamic SQL

+0

_SQL其文本是在編譯時未知._幫助 –

-1

是的,正如你所說的oracle pl/sql語法不允許的那樣,通過變量傳遞表名。正如你也說你只能通過動態SQL完成,並可直接:

execute immediate 'select count(*) from ' || table_in 
into l_return; 
+0

'table_in'是一個存儲表格名稱的變量。我是tryong來統計表中的總行數。 –