Oracle - 如何使用参数执行查询?

时间:2017-05-26 09:50:17

标签: oracle

我是Oracle的新手,我正在尝试使用一些参数执行一个简单的选择,但我无法让它工作。 对于

SELECT idl.column_value clientguid
FROM TableName idl 
LEFT JOIN :ParamName_Type olt ON olt.clientguid = idl.column_value
WHERE (olt.flag = 0)

但声明不起作用。我在互联网上找不到任何帮助。 感谢。

1 个答案:

答案 0 :(得分:2)

Oracle SQL Developer应该像SQLPlus一样处理变量,即使用&

例如(为简单起见,在SQLPlus中):

SQL> select 1 from &tableName;
Enter value for tablename: dual
old   1: select 1 from &tableName
new   1: select 1 from dual

         1
----------
         1

您不能做的是将参数用作表名的一部分,假设开发人员“知道”哪个部分是参数名称,哪个部分是固定部分。 例如:

SQL> select * from &ParamName_Type;
Enter value for paramname_type:

即,所有字符串ParamName_Type都将被解释为变量名称,并替换为您输入的值。

另外,请考虑这是特定于客户端的行为,而不是Oracle DB行为;所以,同样的事情在不同的客户端(例如Toad for Oracle)中不起作用。

考虑您正在尝试使用表示表名的“参数”,并且您只能通过某个客户端来执行此操作,因为普通的SQL不允许它。 如果您需要在某些代码中执行此类操作,无论客户端是否必须工作,您都需要动态SQL

如果你需要更复杂的东西,你可能需要一些动态SQL;例如:

SQL> declare
  2      vTableName varchar2(30) := '&table_name';
  3      vSQL       varchar2(100):= 'select 1 from ' || vTableName || 
                                    ' union all select 2 from ' || vTableName;
  4      type tResult is table of number;
  5      vResult    tResult;
  6  begin
  7      execute immediate vSQL bulk collect into vResult;
  8      --
  9      -- do what you need with the result
 10      --
 11      for i in vResult.first .. vResult.last loop
 12          dbms_output.put_line(vResult(i));
 13      end loop;
 14  end;
 15  /
Enter value for table_name: dual
old   2:     vTableName varchar2(30) := '&table_name';
new   2:     vTableName varchar2(30) := 'dual';
1
2

PL/SQL procedure successfully completed.

SQL>