5

有没有办法使用绑定变量将列名和表名动态传递给查询?这可以通过使用简单的连接运算符来完成||,但我想要一种不同的方法来实现这一点。

编辑

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

在这个例子中,我通过column_nameasempno,enametable_nameasemp

但是这种方法对我不起作用。除了传统的连接方法之外,是否有可能采用不同的方法?

4

3 回答 3

16

表名和列名不能作为绑定变量传递,不。绑定变量的全部意义在于,Oracle 可以为语句生成一次查询计划,然后使用不同的绑定变量值执行多次。如果优化器不知道正在访问哪个表或正在选择和过滤哪些列,它就无法生成查询计划。

如果您担心 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 回答