[解決済み] 変数の宣言とそれを同じOracle SQLスクリプトで使用する方法は?
2022-05-11 19:35:36
質問
再利用可能なコードを書きたいので、最初にいくつかの変数を宣言して、スクリプトの中で再利用する必要があります、例えば。
DEFINE stupidvar = 'stupidvarcontent';
SELECT stupiddata
FROM stupidtable
WHERE stupidcolumn = &stupidvar;
SQLDeveloperのように、変数を宣言して、その後に続くステートメントで再利用するにはどうすればよいですか?
試行回数
-
DECLAREセクションを使用し、以下のSELECTステートメントを
BEGIN
とEND;
. を使用して変数にアクセスします。&stupidvar
. -
キーワードを使用する
DEFINE
を作成し、変数にアクセスします。 -
キーワードの使用
VARIABLE
を作成し、変数にアクセスします。
しかし、試行錯誤の結果、様々なエラーが発生します(Unbound variable、Syntax error、Expected
SELECT INTO
...).
解決方法は?
SQL*Plusスクリプトで変数を宣言するには、いくつかの方法があります。
1つ目は、VARを使用してバインド変数を宣言する方法です。 VARに値を代入する仕組みは、EXECコールで行います。
SQL> var name varchar2(20)
SQL> exec :name := 'SALES'
PL/SQL procedure successfully completed.
SQL> select * from dept
2 where dname = :name
3 /
DEPTNO DNAME LOC
---------- -------------- -------------
30 SALES CHICAGO
SQL>
VARは、OUTパラメータを持つストアドプロシージャや関数を呼び出したい場合に特に有効です。
また、代用変数を使用することもできます。 これらは対話型モードに向いています。
SQL> accept p_dno prompt "Please enter Department number: " default 10
Please enter Department number: 20
SQL> select ename, sal
2 from emp
3 where deptno = &p_dno
4 /
old 3: where deptno = &p_dno
new 3: where deptno = 20
ENAME SAL
---------- ----------
CLARKE 800
ROBERTSON 2975
RIGBY 3000
KULASH 1100
GASPAROTTO 3000
SQL>
他のスクリプトを呼び出すようなスクリプトを書く場合、前もって変数を定義しておくと便利です。このスニペットは、値を入力するよう促されることなく実行されます。
SQL> def p_dno = 40
SQL> select ename, sal
2 from emp
3 where deptno = &p_dno
4 /
old 3: where deptno = &p_dno
new 3: where deptno = 40
no rows selected
SQL>
最後に、匿名PL/SQLブロックです。 ご覧の通り、宣言された変数に対話的に値を代入することができます。
SQL> set serveroutput on size unlimited
SQL> declare
2 n pls_integer;
3 l_sal number := 3500;
4 l_dno number := &dno;
5 begin
6 select count(*)
7 into n
8 from emp
9 where sal > l_sal
10 and deptno = l_dno;
11 dbms_output.put_line('top earners = '||to_char(n));
12 end;
13 /
Enter value for dno: 10
old 4: l_dno number := &dno;
new 4: l_dno number := 10;
top earners = 1
PL/SQL procedure successfully completed.
SQL>
関連
-
ERROR 1136 (21S01) を解決してください。列の数が Mysql の行 1 の値の数と一致しません。
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] Oracleで上位100行を選択する方法は?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] Pythonの変数名や関数名の命名規則について教えてください。
-
[解決済み] MySQLで変数を宣言する方法は?
-
[解決済み] OracleのViewsとMaterialized Viewsの違いは何ですか?
-
[解決済み】Oracleクエリが順序付け後に返す行数を制限するにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Oracleで変数を宣言して表示する方法
-
executeQuery()ソリューションでデータ操作文を発行できない。
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] SQLの複数列の順序付け
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] SQL Serverで、ある日付より大きいすべての日付を照会するにはどうすればよいですか?
-
[解決済み] VARCHARとCHARの違いは何ですか?