web-dev-qa-db-ja.com

SQLクエリでコロン記号「:」は何をしますか?

:クエリの略?

INSERT INTO MyTable (ID) VALUES (:myId)

どのようにして目的の値を取得しますか?

編集:また、そのサインは何と呼ばれていますか? Googleで検索したかったのですが、:

41
Jla

これは、Oracleでは バインド変数 と呼ばれます。

「:」の名前は何ですか?

結腸。

45
OMG Ponies

「:」はクエリで何を表しますか?

バインド変数 。バインド変数を使用すると、1つのSQLステートメント(クエリまたはDML)を何度も再利用できます。これにより、セキュリティ(SQLインジェクション攻撃を許可しない)とパフォーマンス(必要な解析量を減らす)が向上します。

どのようにして目的の値を取得しますか?

Oracleがクエリ(またはDML)を実行する前に、プログラムがカーソルを作成します。プログラムは、そのカーソルに対して解析されるSQLを発行し、SQLによって参照される各バインド変数の値をバインドする必要があります。これを行う方法は、言語によって異なります。

そのサインは何と呼ばれますか?

コロン。

53
Jeffrey Kemp

これは名前付きクエリパラメータのタグであり、クエリの実際の構文の一部ではありません。タグは、実際に実行される前にクエリを作成するコードで指定された値に置き換えられます。

6
Will Vousden

コロン:は、HQL Hibernate Query Languageでパラメーターが関係していることを示すために使用されます。

つまり、SQL構文:

SELECT * FROM EMPLOYEE WHERE EMP_ID = empID

hQL構文と同じです:

SELECT * FROM EMPLOYEE WHERE EMP_ID = :empID

empIDはパラメーターのローカル変数です...

お役に立てれば。

6
RAHUL

名前付きパラメーター です。

C#では、パラメーターの前に@を付けます( here を参照)。

5
kgiannakakis

次の文を考慮してください

select name from T_emp where id=1;
select name from T_emp where id=2;
select name from T_emp where id=3;

文が実行されるたびに、Oracleは同じクエリの以前の出現をチェックします。同じクエリが見つかった場合、同じ実行計画を使用します。そうでない場合は、さまざまな実行パスを見つけて、最適な実行プランを見つけて実行する必要があります。

人間とは異なり、IDのみが変更されたことを認識するほどインテリジェントではありません(上記の例のように)。したがって、それはすべての闘争を通過し、実行します。

しかし、Oracleに同様のステートメントであり、同じ実行計画を使用できることをOracleに伝える方法があります-BIND VARIABLE。以下の例をご覧ください。

declare
  v_id number;
  v_name varchar2(30);
  type c is ref cursor;
  c1 c;
begin
  for i in 1..100
   loop
    open c1 for 'select * from T_emp where id = :x' using i;
    fetch c1 into v_name;
    dbms_output.put_line('name is ' || v_name);
   end loop;
END;

バインド変数を使用すると、パフォーマンスが10倍向上します。 PL/SQLはバインド変数を単独で使用します(明示的に指示する必要はありません)

4
Natty

これは、Delphiクエリのパラメーター構文でもあります

1
Leslie