PL/SQLでT-SQLのように変数を宣言して使用するには?
SQL Serverでは、ストアドプロシージャの本体をテストする際に、本体をSSMSにコピーし、ページ上部の変数をDECLAREし、サンプル値を設定して、そのまま実行することがよくあります。
例えば、私のプロシージャが
CREATE PROC MySampleProc
@Name VARCHAR(20)
AS
SELECT @Name
とすると、テスト用のSQLは次のようになります。
DECLARE @Name VARCHAR(20)
SET @Name = 'Tom'
SELECT @Name
これに相当するOracle PL/SQLは何でしょうか?
これは私が思いついた最も近いものですが、私は "PLS-00428: an INTO clause is expected in this SELECT statement" が表示されます。
DECLARE
myname varchar2(20);
BEGIN
myname := 'Tom';
select myname from DUAL;
END;
これは、私が本当にやろうとしていることのより良い例です。
DECLARE
myname varchar2(20);
BEGIN
myname := 'Tom';
SELECT *
FROM Customers
WHERE Name = myname;
END;
しかし、繰り返しになりますが、これは 'INTO'を要求しています。実際には、レコードを画面に表示したいだけで、別のテーブルに保存したいわけではありません。....
RESOLVED:
Allanさんのおかげで、十分に動作するようになりました。 Oracle SQL Developerは、与えられたパラメータ値を記憶しているようです。 しかし、PL/SQL Developerは、これとは何の関係もありません。....
もし、"Run As Script" とすれば、デフォルトに従いますが、結果はグリッドやスプレッドシートではなく、ASCIテキストとしてのみ返されます。
24
3
改訂版の回答。
他のプログラムからこのコードを呼び出さないのであれば、PL/SQLをスキップして、バインド変数を使用してSQLで厳密に処理するという方法もあります。
多くのツール(Toad や SQL Developer など)では、
var
とexec
の記述を省略すると、プログラムが値の入力を促すようになります。オリジナルの回答。
T-SQLとPL/SQLの大きな違いは、Oracleではクエリの結果を暗黙的に返すことができないことです'。結果は常に何らかの方法で明示的に返す必要があります。 最も簡単な方法は、
DBMS_OUTPUT
(print
とほぼ同じ)を使って変数を出力することです。しかし、結果セットを返そうとしている場合、これはあまり役に立ちません。その場合には、コレクションを返すか、リフカーソルを返すことになります。しかし、これらの解決策を使うには、コードを関数やプロシージャで囲み、結果を消費できるものからその関数やプロシージャを実行する必要があります。この方法で動作する関数は、次のようなものになります。
Oracle PL/SQLでは、複数の行を返す可能性のあるクエリを実行する場合、結果を反復処理するためのカーソルが必要になります。最も簡単な方法は、例えば、forループを使うことです。
正確に1つの行を返すクエリがある場合は、次のように
select...into...
構文を使用できます。変数は定義ではなく、宣言です。
これは https://stackoverflow.com/questions/8469301/declare-variables-in-a-pl-sql-block と重複する可能性があります。
しかし、ここを見ることができます。
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#i27306
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/overview.htm
UPDATE
こちらを参照 : https://stackoverflow.com/questions/2153053/how-to-return-a-resultset-cursor-from-a-oracle-pl-sql-anonymous-block-that-exe