我是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
- 00000 - “行%s,列%s:\ n%s”
原因:通常是PL / SQL编译错误。
答案 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命名标准!