簡體   English   中英

Oracle 10g中的DBMS_SQL.TO_REFCURSOR等效項

[英]DBMS_SQL.TO_REFCURSOR equivalent in Oracle 10g

我有以下代碼:

 procedure Replace(sUser in Varchar2,sNomTable in varchar2,sColonne in varchar2,sID in Varchar2,nbCharAlterer IN NUMBER)  is

   l_cursor NUMBER;
   l_return NUMBER;
   l_ref_cursor SYS_REFCURSOR;
   TYPE t_tab IS  TABLE OF VARCHAR2(4000);
   l_tab t_tab;
   l_tab_Id t_tab;
   sChaine VARCHAR2(4000 CHAR);
   sqlReq CONSTANT VARCHAR2(1000):= 'select  ' || sId || ',' ||  sColonne || ' from ' || sUser || '.' || sNomTable  ;

begin
   --
   l_cursor := DBMS_SQL.open_cursor;
   DBMS_SQL.parse(l_cursor, sqlReq, DBMS_SQL.NATIVE);
   l_return := DBMS_SQL.EXECUTE(l_cursor);
   -- Connvert from DBMS_SQL to a REF CURSOR.
   l_ref_cursor := DBMS_SQL.to_refcursor(l_cursor);

在這里,我得到以下錯誤:

pls 00302 component 'TO_REFCURSOR' must be declared

因為我的oracle版本是10g。

知道如何在Oracle 10g中做到等效嗎?

這是使用本地動態sql的方法:

PROCEDURE p_replace(suser         IN VARCHAR2,
                    snomtable     IN VARCHAR2,
                    scolonne      IN VARCHAR2,
                    sid           IN VARCHAR2,
                    nbcharalterer IN NUMBER) IS
  v_validate_sid_col_name VARCHAR2(32);
  v_validate_scolonne_col_name VARCHAR2(32);
  v_validate_suser VARCHAR2(32);
  v_validate_snomtable VARCHAR2(32);

  sqlreq VARCHAR2(2000);

  refcur sys_refcur;
BEGIN
  -- Check the input values are valid identifiers (to avoid sql injection)
  -- N.B. this does not check they are valid object names!
  v_validate_sid_col_name := dbms_assert.qualified_sql_name(sid);
  v_validate_scolonne_col_name := dbms_assert.qualified_sql_name(scolonne);
  v_validate_suser := dbms_assert.qualified_sql_name(suser);
  v_validate_snomtable := dbms_assert.qualified_sql_name(scolonne);

  sqlReq := 'select  ' || v_validate_sid_col_name || ',' ||
                          v_validate_scolonne_col_name ||
            ' from ' || v_validate_suser || '.' || v_validate_snomtable;

  -- or maybe you want to use execute immediate to bulk collect into arrays?
  OPEN refcur FOR sqlreq;

  ...
END p_replace;

請注意,由於“ replace”是一個預先存在的內置函數的名稱,因此我已更改了過程的名稱,因此並不是一個很好的名稱。

您沒有提到查詢結果將要做什么,所以我不確定打開ref游標是否真正需要的,或者不確定通過execute立即執行批量收集是否對您更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM