2011-11-07 7 views
6

1時間の研究にもかかわらず、変数を正しく定義してSQLで使用する方法を理解できないようです。シンプルなOracle変数SQLの割り当て

ORA-06550:行1、列63:

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

そのうち、私は返事をもらう:PLS-00103を:

この

は私がこれまでに生産されているものですが発生しました

beginファンクションプラグマプロシージャサブタイプタイプ使用形態以下のいずれかが必要な場合は、シンボル "end-of-file"カーソル

詳細: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ブロックでスコープされた変数(本文はBEGINおよびEND;で区切られます)を定義するために使用されます。どのようにこの変数を使用しますか?

次のPL/SQLは、私のために正常に動作します:あなたはまた、単純な文字列置換変数を使用するようにDEFINEステートメントを使用することができます

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; 

。 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 * Plusで同じことを行うことができるようにしたい)以下のように、あなたはそれを書くことができますSQL Serverは、変数を処理する方法と同様に、それをしたい場合:

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 statement"コマンドではなく、 "Execute as script"を通して実行する必要があります。

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-specificなものを除き、from dual)。