我是Oracle的新手,我正在尝试使用一些参数执行一个简单的选择,但我无法让它工作。 对于
SELECT idl.column_value clientguid
FROM TableName idl
LEFT JOIN :ParamName_Type olt ON olt.clientguid = idl.column_value
WHERE (olt.flag = 0)
但声明不起作用。我在互联网上找不到任何帮助。 感谢。
答案 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>