2011-11-07 23 views
6

儘管花了一個小時的研究,我似乎無法弄清楚如何正確地定義一個變量,然後在你的SQL中使用它。簡單的Oracle變量SQL作業

這是我迄今所生產的:

DECLARE startDate DATE := to_date('03/11/2011', 'dd/mm/yyyy');

的我得到的回答是:

ORA-06550:第1行,列63:PLS-00103:出現符號 當期望以下之一時出現「文件結束」:

開始函數包編譯指示過程子類型類型使用表格當前 光標

詳細信息:DECLARE startDate DATE:= to_date('03/11/2011', 'dd/mm/yyyy');期待的 的一個時所遇到的符號「結束文件」以下::錯誤位於第1行ORA-06550:行1,列63: PLS-00103

開始功能包編譯程序亞型類型使用形式目前 光標

我很想知道如何做這麼簡單的任務!

+3

變量是一個客戶端構造。您需要告訴我們您使用的客戶端。 – APC

+0

@APC - 我正在使用TOAD –

回答

10

您的變量聲明是正確的。

DECLARE關鍵字用於定義範圍在PL/SQL塊(其正文由BEGINEND;定界)的變量。你想如何使用這個變量?我

下面的PL/SQL正常工作:

DECLARE 
    startDate DATE := to_date('03/11/2011', 'dd/mm/yyyy'); 
    reccount INTEGER; 
BEGIN 
    SELECT count(*) INTO reccount 
     FROM my_table tab 
     WHERE tab.somedate < startDate; 
    dbms_output.put_line(reccount); 
END; 

您還可以使用DEFINE語句中使用簡單的字符串替換變量。它們適用於SQL/PLUS或TOAD等客戶端。

DEFINE start_date = "to_date('03/11/2011', 'dd/mm/yyyy')" 
SELECT COUNT(*) from my_table tab where tab.some_date < &start_date; 
+1

那麼是否沒有辦法像MS SQL那樣簡潔地完成它,它是一個簡單的'declare @varible set @ variable'?我想稍後在'WHERE'子句中使用該變量,我該怎麼做?我怎麼也打印變量到屏幕? –

+0

我對MS SQL並不熟悉,但是如果您引用了某種全局變量,則可以在包中定義一個變量,從而使其對所有包成員都可見,即使全局變量是您'可能要避免。您可以使用['dbms_output.put_line'](http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_output.htm#i1000105)將變量打印到屏幕上。 –

+0

不是一個全局變量 - 只是一個普通的變量,我可以分配,然後在以後使用 –

3

採取記住,Oracle的PL/SQL是 SQL。

PL/SQL是一種過程語言。 SQL不是程序性的,但可以定義用戶可以通過「& var」語法輸入的「變量」(請參閱​​http://www.orafaq.com/node/515)。

5

要完成您在蟾蜍中嘗試的內容,根本不需要聲明該變量。只需包含以冒號開頭的變量,當您執行查詢時,Toad將提示您輸入變量的值。例如:

select * from all_tables where owner = :this_is_a_variable; 

如果最初不工作,任何地方在編輯器中單擊鼠標右鍵,並確保「替換變量提示」被選中。

如果你真的想同樣做到SQL Server處理變量的方式(或者你想能夠做同樣的事情在SQL * Plus),您可以按如下寫:

var this_is_a_variable varchar2(30); 

exec :this_is_a_variable := 'YOUR_SCHEMA_NAME'; 

print this_is_a_variable; 

select * from all_tables where owner = :this_is_a_variable; 

但是,要在Toad中完成這項工作,您需要通過「Execute as script」執行,而不是使用典型的「Execute語句」命令。

0

能否請您試試這個:

DEF startDate = to_date('03/11/2011', 'dd/mm/yyyy'); 
Select &startDate from dual; 
3

這是舊的文章,但如果有人在此跌倒(因爲我只是做了),你可以用一個CTE處理這個問題:

with params as (
     select date '2011-11-03' as startdate 
     from dual 
    ) 
select . . . 
from params cross join 
    . . . 

幾乎相同的語法在SQL Server中工作(減去date特定的內容和from dual)。