5

バインド変数を使用して列名とテーブル名をクエリに動的に渡す方法はありますか?これは、単純な連結演算子を使用して実行できますが||、これを実現できる別のアプローチが必要です。

編集

OPEN abc_cur FOR 'Select :column_name
                  from :table_name' 
                USING column_name,table_name;

この例では、column_nameasempno,enametable_nameasを渡しますemp

しかし、このアプローチは私にはうまくいきません。従来の連結アプローチとは異なるアプローチをとることは可能ですか?

4

3 に答える 3

16

テーブル名と列名をバインド変数として渡すことはできません。バインド変数の要点は、Oracleがステートメントに対してクエリプランを1回生成し、それをさまざまなバインド変数値で何度も実行できることです。オプティマイザは、アクセスされているテーブル、または選択されてフィルタリングされている列を認識していない場合、クエリプランを生成できません。

懸念がSQLインジェクション攻撃に関連していて、動的SQLが実際に必要であると想定している場合(ほとんどの場合、動的SQLに頼る必要があるということは、データモデルに問題があることを意味します)、DBMS_ASSERTパッケージを使用してテーブル名と列名に埋め込みSQLは含まれていません。

于 2012-03-15T16:35:07.237 に答える
6

いいえ、あなたがすることはできません。クエリのテーブル名または列名を変更すると、そのクエリのセマンティクスが変更されます。つまり、のクエリになります。

バインド変数とは、同じクエリに異なる値を渡すことです。オプティマイザーは、クエリを再解析して最適化することなく、さまざまな値でクエリを再利用できます。

于 2012-03-15T16:35:14.723 に答える
0

<select>要素の値に応じてクエリのテーブルを変更する必要がある場合にも、同様の問題が発生しました。ここでのほとんどの回答では、テーブル名をバインド変数として渡すことはできないと言われていましたが、テーブルの名前を含む変数を作成してSQLクエリに渡すと、実際に機能しました。

<?php

$conn = mysqli_connect("<host>", "<username>", "<password>", "<database>");

$variable = "table_name";
$sql = $conn->("SELECT <column_name> FROM $variable ....);

?>

つまり、関数を作成し、関数内にすべてのsqlクエリを記述しました。そして、関数パラメーターには、$tableという変数を渡しました。

function getResult($table){
    
$conn = mysqli_connect("<host>", "<username>", "<password>", "<database>");
    $minDate = $conn->real_escape_string($_POST['minDate']);
    $maxDate = $conn->real_escape_string($_POST['maxDate']);
    $jobName = $conn->real_escape_string($_POST['jobName']);



$sql = $conn->query("SELECT COUNT(countX) as boxCount FROM $table WHERE job_name='$jobName' AND dateX BETWEEN '$minDate' AND '$maxDate'");


/* ... I removed the other operations from the code to make it compact */

次に、ジョブの名前の値に応じてターゲットテーブルを変更する条件を記述しました。

if ($_POST['jobName'] === "job1"){
    getResult("table_name");
}
else if($_POST['jobName'] === "job2") {
    getResult("table_name");
}
于 2021-05-15T09:28:26.963 に答える