【发布时间】:2016-07-29 19:41:58
【问题描述】:
我正在使用 Oracle 11g 数据库,发布 11.2.0.3.0 - 64 位生产
我有几个已定义的包、过程、函数和数据类型。在大量使用集合、数组和其他数据结构完成大量中间计算之后,我最终需要动态创建一个数据库表来输出我的最终结果。对于这个问题,我有以下几点:
TYPE ids_t IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
benefit_ids ids_t;
--Lots of other code which successfully populates benefit_ids.
--benefit_ids has several million rows, and is used successfully as
the input to the following function:
FUNCTION find_max_ids(in_ids in ids_t)
RETURN ids_t
IS
str_sql varchar2(200);
return_ids ids_t;
BEGIN
str_sql := 'SELECT max(b.benefit_id)
FROM TABLE(:1) a
JOIN benefits b ON b.benefit_id = a.column_value
GROUP BY b.benefit_id';
EXECUTE IMMEDIATE str_sql BULK COLLECT INTO return_ids USING in_ids;
RETURN return_ids;
END;
上述工作正常,清楚地表明可以将数组作为参数传递给动态 sql 函数或过程。
但是,当我尝试使用 EXECUTE IMMEDIATE 和 USING 创建一个数据库表作为我的最终输出时,我遇到了问题:
PROCEDURE create_output_table(in_ids in ids_t, in_tbl_nme in varchar2)
AUTHID CURRENT_USER
IS
str_sql := 'CREATE TABLE Final_Results AS (
SELECT a.client_id, a.benefit_id
FROM ' || in_tbl_nme || ' a
LEFT JOIN TABLE(:1) b on b.column_value = a.benefit_id
WHERE b.column_value is NOT NULL)';
EXECUTE IMMEDIATE str_sql USING IN in_ids;
END;
我收到的唯一错误消息是 ORA-00933:SQL 命令未正确结束。但是,我看不出语法本身有什么问题,尽管我怀疑问题在于我如何在这种情况下应用 EXECUTE IMMEDIATE。
如有任何建议,我们将不胜感激。
【问题讨论】:
-
我看不到您已声明 str_sql 并且缺少 BEGIN 关键字。尝试将这些内容合并到您的代码中。
标签: oracle plsql dynamic-sql