在Oracle连接语句

时间:2017-03-30 09:38:40

标签: 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 = :name' ;
EXECUTE IMMEDIATE v_strQuery using v_Removalsql

当我执行上面的脚本时,它会给出以下错误

  

PLS-00103:遇到以下任何一种情况时遇到符号“=”:

     
      
  • 常例异常
  •   
  • table long double ref
  •   
  • 字符时间时间戳间隔日期二进制国家字符
  •   
  • 的nchar      
        
    1. 00000 - “行%s,列%s:\ n%s”
    2.   
  •   
     

原因:通常是PL / SQL编译错误。

1 个答案:

答案 0 :(得分:1)

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

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

这是你可以做到这一点的一种方式(我使用了一个参考光标来演示;这也适用于EXECUTE IMMEDIATE,但是你必须再次指定数据的存储位置,如前所述,Alex):

DECLARE
  v_Removalsql varchar(100);
  v_strQuery VARCHAR(1000);
  v_refcur SYS_REFCURSOR;
BEGIN
  v_Removalsql := 'Node.ElectronicSerialNumber'
  v_strQuery := 'select * from ConsumerMessage join Node on ConsumerMessage.ElectronicSerialNumber = :name';

  -- check the string to be concatenated is a valid qualified sql name format
  -- this helps to avoid sql injection, but doesn't check whether the referenced
  -- object exists or not, so if it doesn't the dynamic query will still fail.
  dbms_assert.qualified_sql_name(v_remvoalsql);

  -- Now we can go ahead and replace the string ":name" with the new string
  v_strQuery := REPLACE(v_strQuery, ':name', v_removalsql);

  -- Finally, we can open a ref cursor for the dynamic sql:
  OPEN v_refcur FOR v_strQuery;
END;
/

另一种方法是不在您的sql语句中使用:name并简单地连接查询的单独元素,例如:

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

确保您确保检查构建到字符串中的所有参数,以确保它们符合Oracle命名标准!