此代码:
set serveroutput on;
CREATE OR REPLACE PROCEDURE TAX_COST_SP(
p_state IN BB_TAX.STATE%TYPE,
p_subtotal IN BB_TAX.TAXRATE%TYPE,
p_tax_amount OUT BB_TAX.TAXRATE%TYPE)
IS
BEGIN
SELECT TAXRATE*p_subtotal INTO p_tax_amount FROM BB_TAX WHERE STATE='p_state';
END TAX_COST_SP;
var G_TAX NUMBER;
EXECUTE TAX_COST_SP('VA',100,:G_TAX);
dbms_output.put_line(g_tax);]
产生以下错误:
执行过程时pl / sql代码出错Error(9,1):PLS-00103: 遇到符号“VAR”
有人可以帮忙吗?
答案 0 :(得分:0)
这样的东西对你有用
DECLARE
var G_TAX NUMBER;
CREATE OR REPLACE PROCEDURE TAX_COST_SP(
p_state IN BB_TAX.STATE%TYPE,
p_subtotal IN BB_TAX.TAXRATE%TYPE,
p_tax_amount OUT BB_TAX.TAXRATE%TYPE)
IS
BEGIN
SELECT TAXRATE*p_subtotal INTO p_tax_amount FROM BB_TAX WHERE
STATE='p_state';
END TAX_COST_SP;
BEGIN
EXECUTE TAX_COST_SP('VA',100,:G_TAX);
dbms_output.put_line(g_tax);
END;
答案 1 :(得分:0)
这些解决方案存在结构性问题。首先,“创建或替换 StoredProcedureType ....结束”代表它自己,不能在plsql块中,“Declare”打开。 (你可以把它放在一个块中,完全包含在ticks(')中,因此是一个字符串,然后使用execute immediate。)它是DDL“Create table”的代码。所以它需要来自声明或更好的另一个会话或至少一个单独的缓冲区(假设你正在使用sqlplus)。其次,“var”和“execute”是slqplus命令而不是plsql语句;所以他们也不会进入plsql块。在一个块中,您不需要告诉plsql您正在定义一个变量;只是定义它。你也没有使用EXECUTE来调用一个程序;只需使用它的名称并提供参数。在sqlplus中使用单斜杠(/)告诉sqlplus运行进程。所以你的单个sqlplus缓冲区变为:
Create Or Replace Procedure tax_cost_sp(
p_state in bb_tax.state%type,
p_subtotal in bb_tax.taxrate%type,
p_tax_amount out bb_tax.taxrate%type)
is
begin
select taxrate*p_subtotal
into p_tax_amount
from bb_tax
where state='p_state';
end tax_cost_sp;
/
-- BETTER to start new session or buffer here
declare
g_tax number;
begin
tax_cost_sp('VA',100,g_tax);
dbms_output.put_line(g_tax);
end;
/
现在,您在程序中遇到严重错误。 WHERE子句告诉Oracle检索包含文字“p_state”的状态,而不是参数p_state的内容。除非表包含值为“p_state”的STATE列,否则将获得NO_DATA_FOUND异常。您的WHERE子句应为:
where state=p_state;
最后,由于您要计算单个值,请考虑函数而不是过程。然后,您可以在SQL中使用它,如下所示(您无法使用过程)。
Select tax_cost_sp('VA',100) from dual;