34

Sql Server では、多くの場合、ストアド プロシージャの本体をテストするときに、本体を SSMS にコピーし、ページの上部で変数を宣言し、いくつかのサンプル値に設定して、本体をそのまま実行します。

たとえば、私のprocが

CREATE PROC MySampleProc
    @Name   VARCHAR(20)
AS
    SELECT @Name

次に、私のテストSQLは次のようになります

DECLARE @Name VARCHAR(20)
SET     @Name = 'Tom'

    SELECT @Name

これに相当する Oracle PL/SQL は何ですか?

これは私が思いついた最も近いものですが、「PLS-00428: この SELECT ステートメントには INTO 句が必要です」というメッセージが表示されます。

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」が必要です....

解決済み:

@Allanのおかげで、十分に機能しています。Oracle SQL Developer は、指定したパラメータ値を記憶しているようです。ただし、PL/SQL開発者はこれとは何の関係も望んでいません....

ここに画像の説明を入力

「スクリプトとして実行」すると、デフォルトに従いますが、グリッド/スプレッドシートではなく、ASCI テキストとしてのみ結果を返します

ここに画像の説明を入力

4

3 に答える 3

30

修正された回答

このコードを別のプログラムから呼び出していない場合、オプションは PL/SQL をスキップし、バインド変数を使用して厳密に SQL で実行することです。

var myname varchar2(20);

exec :myname := 'Tom';

SELECT *
FROM   Customers
WHERE  Name = :myname;

多くのツール (Toad や SQL Developer など) では、varandexecステートメントを省略すると、プログラムが値を求めるプロンプトを表示します。


元の回答

T-SQL と PL/SQL の大きな違いは、Oracle ではクエリの結果を暗黙的に返すことができないことです。結果は常に何らかの方法で明示的に返される必要があります。最も簡単な方法は、DBMS_OUTPUT(とほぼ同等print) を使用して変数を出力することです。

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     dbms_output.print_line(myname);
END;

ただし、結果セットを返そうとしている場合、これはあまり役に立ちません。その場合、コレクションまたは refcursor を返す必要があります。ただし、これらのソリューションのいずれかを使用するには、コードを関数またはプロシージャでラップし、結果を消費できるものから関数/プロシージャを実行する必要があります。このように機能する関数は、次のようになります。

CREATE FUNCTION my_function (myname in varchar2)
     my_refcursor out sys_refcursor
BEGIN
     open my_refcursor for
     SELECT *
     FROM   Customers
     WHERE  Name = myname;

     return my_refcursor;
END my_function;
于 2012-06-04T19:53:10.733 に答える
5

Oracle PL/SQL では、複数の行を返す可能性のあるクエリを実行している場合、結果を反復処理するためのカーソルが必要です。最も簡単な方法は、for ループを使用することです。次に例を示します。

declare
  myname varchar2(20) := 'tom';
begin
  for result_cursor in (select * from mytable where first_name = myname) loop
    dbms_output.put_line(result_cursor.first_name);
    dbms_output.put_line(result_cursor.other_field);
  end loop;
end;

正確に 1 行を返すクエリがある場合は、次のselect...into...構文を使用できます。

declare 
  myname varchar2(20);
begin
  select first_name into myname 
    from mytable 
    where person_id = 123;
end;
于 2012-06-04T20:26:53.540 に答える
1

変数は定義されていませんが、宣言されています。

これは、pl/sql ブロッ​​ク内の宣言変数の重複の可能性があります

しかし、ここを見ることができます:

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

アップデート:

ここを参照してください:動的SQLを実行するOracle PL / SQL匿名ブロックから結果セット/カーソルを返す方法は?

于 2012-06-04T19:02:14.290 に答える