"DEFINE" 命令 Oracle 数据库上的 SQL 语句无效
Invalid SQL Statements on "DEFINE" commands Oracle Database
我是 oracle 的新手,当我尝试使用 define 命令时,我遇到了 ORA-00900: invalid SQL statement 错误。这是我的代码:
DEFINE p_num1 = 2;
DEFINE p_num2 = 4;
declare
b1 number(7,3) := &p_num1;
b2 number(7,3) := &p_num2;
v_cont number(7,3);
begin
v_cont := &p_num1/&p_num2;
dbms_output.put_line(v_cont);
end;
/
我哪里错了?
我已经很多年没有使用 Oracle 了,但它看起来像 DEFINE only allows you to create text variables。您现在正在用一个数字除以一个字符。
您仍然可以这样做,只需将它们分配给“1”和“2”,然后将它们转换为数字,以便能够对其进行操作。但看起来这样太乱才是正确的做法。
var p_num1 number;
var p_num2 number;
exec :p_num1 := 2;
exec :p_num2 := 4;
col p_num1 new_value p_num1
col p_num2 new_value p_num2
select :p_num1 p_num1
, :p_num2 p_num2
from dual;
select :p_num1/:p_num2 from dual;
select '&p_num1'/'&p_num2' from dual;
declare
b1 number(7,3) := :p_num1;
b2 number(7,3) := :p_num2;
v_cont number(7,3);
begin
v_cont := b1/b2;
dbms_output.put_line(v_cont);
end;
/
输出
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
P_NUM1 P_NUM2
---------- ----------
2 4
:P_NUM1/:P_NUM2
---------------
.5
old 1: select '&p_num1'/'&p_num2' from dual
new 1: select ' 2'/' 4' from dual
'2'/'4'
----------
.5
.5
PL/SQL procedure successfully completed.
编辑
DEFINE p_num1 = 2;
DEFINE p_num2 = 4;
var p_num1 number;
var p_num2 number;
exec :p_num1 := '&p_num1';
exec :p_num2 := '&p_num2';
declare
b1 number(7,3) := :p_num1;
b2 number(7,3) := :p_num2;
v_cont number(7,3);
begin
v_cont := :p_num1/:p_num2;
dbms_output.put_line(v_cont);
end;
/
我认为问题在于,无论您如何 运行 编写您的代码,它都将整个事情视为一个语句。实际上,有三个 - 两个 DEFINE
s(这是一个 SQL*Plus 命令,大多数其他 GUI 数据库工具已经复制)和一个 PL/SQL 块。
如果您使用 SQL*Plus to 运行 上面的内容,它应该可以工作,因为每个语句将被单独解释。
如果您使用的是 Toad 或 SQL Developer 之类的东西,并且您想要一个接一个地执行多个语句,那么您需要将它们 运行 作为脚本。
如果您尝试通过一些前端代码(例如 C# 等)执行此操作,那么您可能最好完全避免使用 DEFINE
,而只使用绑定变量传递值(尽管我不确定如何使用匿名 PL/SQL 块 - 你必须自己查找!)
预计到达时间:
既然你说你在使用 APEX,也许 this 会有一些用处。
我是 oracle 的新手,当我尝试使用 define 命令时,我遇到了 ORA-00900: invalid SQL statement 错误。这是我的代码:
DEFINE p_num1 = 2;
DEFINE p_num2 = 4;
declare
b1 number(7,3) := &p_num1;
b2 number(7,3) := &p_num2;
v_cont number(7,3);
begin
v_cont := &p_num1/&p_num2;
dbms_output.put_line(v_cont);
end;
/
我哪里错了?
我已经很多年没有使用 Oracle 了,但它看起来像 DEFINE only allows you to create text variables。您现在正在用一个数字除以一个字符。
您仍然可以这样做,只需将它们分配给“1”和“2”,然后将它们转换为数字,以便能够对其进行操作。但看起来这样太乱才是正确的做法。
var p_num1 number;
var p_num2 number;
exec :p_num1 := 2;
exec :p_num2 := 4;
col p_num1 new_value p_num1
col p_num2 new_value p_num2
select :p_num1 p_num1
, :p_num2 p_num2
from dual;
select :p_num1/:p_num2 from dual;
select '&p_num1'/'&p_num2' from dual;
declare
b1 number(7,3) := :p_num1;
b2 number(7,3) := :p_num2;
v_cont number(7,3);
begin
v_cont := b1/b2;
dbms_output.put_line(v_cont);
end;
/
输出
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
P_NUM1 P_NUM2
---------- ----------
2 4
:P_NUM1/:P_NUM2
---------------
.5
old 1: select '&p_num1'/'&p_num2' from dual
new 1: select ' 2'/' 4' from dual
'2'/'4'
----------
.5
.5
PL/SQL procedure successfully completed.
编辑
DEFINE p_num1 = 2;
DEFINE p_num2 = 4;
var p_num1 number;
var p_num2 number;
exec :p_num1 := '&p_num1';
exec :p_num2 := '&p_num2';
declare
b1 number(7,3) := :p_num1;
b2 number(7,3) := :p_num2;
v_cont number(7,3);
begin
v_cont := :p_num1/:p_num2;
dbms_output.put_line(v_cont);
end;
/
我认为问题在于,无论您如何 运行 编写您的代码,它都将整个事情视为一个语句。实际上,有三个 - 两个 DEFINE
s(这是一个 SQL*Plus 命令,大多数其他 GUI 数据库工具已经复制)和一个 PL/SQL 块。
如果您使用 SQL*Plus to 运行 上面的内容,它应该可以工作,因为每个语句将被单独解释。
如果您使用的是 Toad 或 SQL Developer 之类的东西,并且您想要一个接一个地执行多个语句,那么您需要将它们 运行 作为脚本。
如果您尝试通过一些前端代码(例如 C# 等)执行此操作,那么您可能最好完全避免使用 DEFINE
,而只使用绑定变量传递值(尽管我不确定如何使用匿名 PL/SQL 块 - 你必须自己查找!)
预计到达时间: 既然你说你在使用 APEX,也许 this 会有一些用处。