【发布时间】:2016-10-20 22:17:27
【问题描述】:
从 Oracle 存储过程中,是否可以从 SQL 语句中调用子程序?也许一个例子是解释它的更好方法。这是一个简单的例子:
DECLARE
PROCEDURE p_test(in_text VARCHAR2) IS
BEGIN
dbms_output.put_line(in_text);
END;
BEGIN
SELECT p_test('Test') FROM dual;
END;
/
但是,这会导致 ORA-00904 错误。所以,我不相信我的问题的答案是肯定的。尽管如此,我还是想问。
我真正的程序试图做的是比较一百多对字段。所以,是这样的:
DECLARE
PROCEDURE p_compare
(in_old VARCHAR2, in_new VARCHAR2) IS
BEGIN
IF in_old <> in_new THEN
dbms_output.put_line('Mismatch');
INSERT INTO tbl_mismatch VALUES (in_old, in_new);
END IF;
END;
v_old_value_a VARCHAR2(30);
v_new_value_a VARCHAR2(30);
v_old_value_b VARCHAR2(30);
v_new_value_b VARCHAR2(30);
BEGIN
--What I would like to do
SELECT p_compare(old_value_a, new_value_a), p_compare(old_value_b, new_value_b)
FROM (SELECT 'ALPHA' old_value_a, 'ALPHA' new_value_a, 'BETA' old_value_b, 'DELTA' new_value_b FROM dual);
--What I am currently doing
--I have over 100 pairs of fields that I am comparing
--Declaring two variables for each pair becomes cumbersome
SELECT old_value_a, new_value_a, old_value_b, new_value_b
INTO v_old_value_a, v_new_value_a, v_old_value_b, v_new_value_b
FROM (SELECT 'ALPHA' old_value_a, 'ALPHA' new_value_a, 'BETA' old_value_b, 'DELTA' new_value_b FROM dual);
p_compare(v_old_value_a, v_new_value_a);
p_compare(v_old_value_b, v_new_value_b);
END;
/
那么,如果我正在尝试的可能是不可能的,有没有更好的方法来实现我的最终目标?
【问题讨论】:
-
你可以这样调用函数,而不是过程。你对
SELECT p_test('Test') FROM dual有什么期望? -
Aleksej,出于示例的目的,我希望
SELECT p_test('Test') FROM dual返回与p_test('Test')相同的内容。在实际代码中,子程序进行比较和一些额外的操作,并将不同的值插入到一个表中。 -
如果 p_test 是一个过程,它根本不返回任何东西;如果你需要得到一些结果,你需要创建一个返回值的函数
-
您不能从 SQL 调用过程,因为过程不返回值,如果您考虑一下,您可以从 SQL 语句调用子程序的唯一地方是值是必需的。因此,您可以从 SQL 语句调用 FUNCTIONS,但不能从 PROCEDURES 调用。祝你好运。
-
那么为什么需要查询呢?定义一个过程并调用它,而不使用选择