我是甲骨文的新手,所以请耐心等待我 - 我会尽我所能。
我正在编写存储过程。 AS
语句完成后,我有以下代码:
BEGIN
IF v_Node = NULL
BEGIN
SET v_Node = LEFT(v_Tag, INSTR('.', v_Tag)-1)
SET v_Node = (SELECT v_NodeId FROM DBO.nodes WHERE Node = v_Node)
END
我编译的吐出以下错误:
Error(23,5): PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following: * & - + / at mod remainder rem then <an exponent (**)> and or || multiset
任何人都可以帮忙吗? 干杯
答案 0 :(得分:2)
我怀疑你想要像
这样的东西CREATE OR REPLACE PROCEDURE <<procedure name>>( <<parameter list>> )
AS
<<variable declarations>>
BEGIN
IF v_Node IS NULL
THEN
v_Node := substr( v_tag, 1, instr( '.', v_tag ) - 1 );
SELECT v_NodeId -- Is v_NodeID really a column in dbo.nodes? The naming
-- convention would imply that it is a local variable in
-- which case the SELECT statement doesn't make a lot of
-- sense.
INTO v_node
FROM dbo.nodes
WHERE node = v_node;
END IF;
<<more code>>
END;
解释
NULL
,甚至不等于NULL
。您需要使用IS NULL
运算符。LEFT
功能。您可能需要SUBSTR
。SET
不是有效的PL / SQL运算符。您可以使用:=
运算符将表达式的结果分配给变量。您可以使用SELECT ... INTO
将SQL查询的结果分配给本地变量。剩下的问题
v_Node
来分配您要搜索的Node
字符串,并保留您选择的大概数字v_NodeId
,这似乎很奇怪从表中。如果这确实是你的意图,你会想要单独的变量。SELECT
语句没有意义。如果v_NodeId
是局部变量,正如命名约定所暗示的那样,从dbo.nodes
表中选择它是没有意义的。您似乎更有可能选择NodeId
(假设它是dbo.nodes
中的列。)