【发布时间】:2011-05-31 14:25:39
【问题描述】:
我想创建一个 Oracle 包,其中有一个执行一些动态 SQL 的过程。如果我用EXECUTE IMMEDIATE 动态地做这一切,这没问题,但如果查询的静态部分可以编码为静态(进行编译时检查)会更好。
全动态查询示例:
-- v_stmt is built dynamically.
v_stmt := 'SELECT count(*) FROM <here some joins> WHERE <here some conditions>';
EXECUTE IMMEDIATE v_stmt
USING v_param1, v_param2
RETURNING INTO v_count;
我尝试将 FROM 部分设为静态的示例:
-- v_stmt is built dynamically.
v_stmt := 'SELECT count(*) FROM my_package.my_function(:param1, :param2) WHERE <here some conditions>';
EXECUTE IMMEDIATE v_stmt
USING v_param1, v_param2
RETURNING INTO v_count;
FUNCTION my_function(
i_param1 IN VARCHAR2,
i_param2 IN NUMBER
)
RETURN SYS_REFCURSOR
AS
v_cursor SYS_REFCURSOR;
BEGIN
-- Open a cursor for different queries depending on params.
IF i_param2 = 1 THEN
OPEN v_cursor FOR <some static query>;
ELSE
OPEN v_cursor FOR <some other static query>;
END IF;
RETURN v_cursor;
END;
这行不通,因为无法从 SYS_REFCURSOR 中进行选择(至少我在 Google 中找到了)。
有没有办法达到这个目标?
编辑:根据要求,以下是一些示例:
静态查询:
SELECT a.*, ca.CUS_ID FROM adresses a INNER JOIN customer_adresses ca ON (ca.adr_id = a.adr_id);
SELECT p.*, cp.CUS_ID FROM persons p INNER JOIN customer_persons cp ON (cp.per_id = p.per_id);
然后像下面的例子一样动态扩展它们:
-- Checks if there is an adress in the customer where the zip is null.
SELECT count(*) FROM <static adresses query> q WHERE q.cus_id = :param1 AND a.zip IS NULL;
-- Checks if there is at least one person in the customer.
SELECT count(*) FROM <static persons query> q WHERE q.cus_id = :param1;
【问题讨论】:
-
这可能会也可能不会,这取决于您的具体要求。请给我们提供词干(静态)查询和一些动态扩展的具体示例。
-
@APC 我已经添加了一些示例。
标签: sql oracle plsql oracle11g dynamic-sql