1 回答
TA贡献1825条经验 获得超4个赞
这/是一个用于结束和执行语句的客户端指令。您的错误与提示或 Java 无关,您只需要删除尾部斜杠即可。
您可以看到以其他方式运行语句的相同效果,例如作为匿名块中的动态 SQL:
set serveroutput on
declare
query varchar2(4000);
begin
query := q'[
SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/
T.field AS table_field
FROM your_table T
WHERE T.field = :var
/
]';
dbms_output.put_line(query);
execute immediate query;
end;
/
生成的语句打印为:
SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/
T.field AS table_field
FROM your_table T
WHERE T.field = :var
/
带有尾部斜杠,正如您所说,它将直接在客户端/IDE 中运行;但execute immediate得到与您相同的错误:
ORA-00936: missing expression
ORA-06512: at line 12
斜线被纯粹视为一个除法符号,因此它期待之后的另一个表达式 - 使该子句WHERE T.field = :var / <something>。
如果删除斜杠:
declare
query varchar2(4000);
begin
query := q'[
SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/
T.field AS table_field
FROM your_table T
WHERE T.field = :var
]';
dbms_output.put_line(query);
execute immediate query using 42;
end;
/
生成的语句现在没有它(显然),并且您没有收到错误:
PL/SQL procedure successfully completed.
(我应该选择到的东西-查询在这里仅分析,不会执行,但不要紧,这个例子)。
请注意,语句末尾也不需要分号,因为它是语句分隔符;添加一个会导致不同的错误,如 ORA-00911 无效字符。
添加回答
举报