【问题标题】:How to exceute a query stored in dictionary table into a CURSOR?如何将存储在字典表中的查询执行到 CURSOR 中?
【发布时间】:2014-11-06 14:36:29
【问题描述】:

我有一个名为 QUERIES_DICTIONNARY 的表,它有 2 列(ID、SQL_QUERY),第一列是 NUMBER,第二列是 Varchar,表示 SQL 查询。

CREATE TABLE "QUERIES_DICTIONNARY" 
(
    "ID" NUMBER(10,0) NOT NULL ENABLE, 
    "SQL_QUERY" NVARCHAR2(2000) NOT NULL ENABLE
) 

我想创建一个带有 2 个参数(P_KEY、P_RESULTS_CURSOR)的存储过程,其中 P_KEY 是我的表的 ID,而 P_RESULT_CURSOR 是我对 ID = P_KEY 的记录执行 SQL 查询的地方。

CREATE OR REPLACE PROCEDURE GET_STATISTICS_RESULTS 
(
    P_KEY IN NUMBER,
    P_RESULTS_CURSOR OUT SYS_REFCURSOR 
)

在我的存储过程中,我得到了 ID = P_KEY 的记录 一旦我有了记录,我想使用 EXECUTE IMMEDIATE 在 P_RESULTS_CURSOR 中执行相关查询。

CREATE OR REPLACE PROCEDURE GET_STATISTICS_RESULTS 
(
    P_KEY IN NUMBER
    P_RESULTS_CURSOR OUT SYS_REFCURSOR 
) AS 
    BEGIN
        ---- Get the record
        -- SELECT SQL_QUERY FROM QUERIES_DICTIONNARY WHERE ID = P_KEY; 
        ---- Then Execute the query
        -- OPEN P_RESULTS_CURSOR FOR ? 

    END GET_STATISTICS_RESULTS;

请问如何在一个存储过程中执行此方法?

【问题讨论】:

    标签: sql oracle stored-procedures cursor


    【解决方案1】:

    有两种方法:简单和不那么简单。简单的方法是:

    CREATE OR REPLACE PROCEDURE GET_STATISTICS_RESULTS 
    (
    P_KEY IN NUMBER;
    P_RESULTS_CURSOR OUT SYS_REFCURSOR;
    ) AS 
    cursor_text QUERIES_DICTIONNARY.SQL_QUERY%TYPE; 
    BEGIN
        ---- Get the record
        SELECT SQL_QUERY 
        INTO cursor_text
        FROM QUERIES_DICTIONNARY WHERE ID = P_KEY; 
        ---- Then Execute the query
        OPEN P_RESULTS_CURSOR FOR cursor_text;
    
    END GET_STATISTICS_RESULTS;
    

    不是那么简单的方法 - 使用 DBMS_SQL 包。您可以在文档中查看示例。这将是一个相当复杂的决定。

    【讨论】:

    • 我在 OPEN P_RESULTS_CURSOR FOR cursor_text; 行出现错误错误:PLS-00382:表达式类型错误
    • 嗯。这是因为您表的字段类型为NVARCHAR2。例如,您可以使用to_char 对其进行转换。你真的需要查询NVARCHAR2,而不是'VARCHAR2'吗?
    【解决方案2】:
    CREATE OR REPLACE PROCEDURE GET_STATISTICS_RESULTS 
    (
        P_KEY IN NUMBER
        P_RESULTS_CURSOR OUT SYS_REFCURSOR 
    ) AS 
        l_s "QUERIES_DICTIONNARY"."SQL_QUERY"%TYPE;
        BEGIN
            ---- Get the record
            SELECT SQL_QUERY into l_s FROM QUERIES_DICTIONNARY WHERE ID = P_KEY;
    
            ---- Then Execute the query
            OPEN P_RESULTS_CURSOR FOR l_s; 
        END GET_STATISTICS_RESULTS;
    

    PLS-00382 出现是因为 NVARCHAR2 列。您可以尝试将 nvarchar2 转换为 varchar2:

    l_s VARCHAR2(4000);
    ...
    SELECT CAST(SQL_QUERY AS VARCHAR2(4000)) into l_s FROM QUERIES_DICTIONNARY WHERE ID = P_KEY;
    ...
    

    但是你可能会丢失一些数据。

    【讨论】:

    • 我在 OPEN P_RESULTS_CURSOR FOR l_s 线上遇到了错误 PLS-00382;
    • @cYounes 我想问题出在 NVARCHAR2 上。是否必须将 sqls 保留在 NVARCHAR 列中?
    • @cYounes 您可以将其转换为 varchar2 字段,但某些符号(国家字符)可能转换错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2020-01-11
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多