Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle join语句中动态分配变量_Oracle - Fatal编程技术网

在Oracle join语句中动态分配变量

在Oracle join语句中动态分配变量,oracle,Oracle,我不熟悉oracle脚本。尝试将sql转换为oracle并尝试执行以下脚本作为示例 DECLARE v_Removalsql varchar(100); v_strQuery VARCHAR(1000); v_Removalsql := 'Node.ElectronicSerialNumber' v_strQuery := 'select * from ConsumerMessage join Node on ConsumerMessage.ElectronicSerialNumber = :

我不熟悉oracle脚本。尝试将sql转换为oracle并尝试执行以下脚本作为示例

DECLARE v_Removalsql varchar(100);
v_strQuery VARCHAR(1000);
v_Removalsql := 'Node.ElectronicSerialNumber'
v_strQuery := 'select * from ConsumerMessage join Node on 
ConsumerMessage.ElectronicSerialNumber = :name' ;
EXECUTE IMMEDIATE v_strQuery using v_Removalsql
当我执行上面的脚本时,它给出如下错误

PLS-00103:在预期以下情况时遇到符号“=”:

  • 恒定异常
  • 表长双参考
  • 字符时间戳间隔日期二进制国家字符
  • 恩查尔
  • 00000-“行%s,列%s:\n%s”
原因:通常是PL/SQL编译错误


这听起来像是一个非常奇怪的请求-通常你的加入条件是固定的

无论如何,正如Alex Poole在上面的评论中提到的,当您试图指定表名、列名、where子句等时,不能使用绑定变量;您只能在可能使用文字值的地方使用它。如果您需要动态地指定表名、列名等,那么您需要小心sql注入—您肯定不希望有人为了恶意目的劫持您的过程

这里有一种方法可以做到这一点(我使用了一个ref游标来演示;这也适用于
executeimmediate
,但您必须指定数据存储到的位置,正如Alex前面提到的):

另一种方法是不要在sql语句中使用
:name
,而只是将查询的各个元素连接起来,例如:

open v_refcur for v_select_clause || chr(10) ||
                  v_from_clause || chr(10) ||
                  v_where_clause;

只需确保您在字符串中构建的任何参数都经过检查,以确保它们符合Oracle命名标准

我在你的代码中看到了很多问题;您需要一个BEGIN…END来包装PLSQL块;您缺少一个“;”;您的查询生成了一个没有连接条件的连接;这里不需要动态代码。。。我建议您从或一本好书/教程开始。@Aleksej我相信OP的目的是动态地指定联接条件中使用的列。我不知道为什么,因为这似乎是一个奇怪的要求,但它看起来确实是这样的,但是如果你不能用绑定变量来实现,那么它必须被连接起来。当然,这并没有走那么远。如果是,动态查询实际上不会执行,因为没有[bulk collect]into子句。。。您需要考虑该查询的结果应该放在哪里。
open v_refcur for v_select_clause || chr(10) ||
                  v_from_clause || chr(10) ||
                  v_where_clause;