【问题标题】:DBMS_SQL.TO_REFCURSOR equivalent in Oracle 10gOracle 10g 中的 DBMS_SQL.TO_REFCURSOR 等效项
【发布时间】:2017-06-15 06:45:52
【问题描述】:

我有以下代码:

 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 中做同样的事情吗?

【问题讨论】:

  • 好吧,我猜是因为我使用的是 Oracle 10g,而 to_refcursor 仅适用于 11g 及更高版本。知道如何在 Oracle 10g 中做同样的事情吗?
  • 我认为您不能在 Oracle 10g 中将 DBMS_SQL 转换为 RefCursor。您必须留在 DBMS_SQL 中并在那里进行所有操作。这是可能的——只是你必须编写更多的代码。
  • 如果你想在 10g 中从 dbms_sql 切换到原生动态 sql,为什么不首先使用原生动态 sql 开始呢?您的示例可以很容易地转换。
  • @Boneist : 你能解释一下如何转换我的例子吗?

标签: oracle plsql oracle10g dynamic-sql


【解决方案1】:

以下是使用本机动态 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”是预先存在的内置函数的名称,因此不是一个很好的名称。

您没有提及您将对查询结果做什么,所以我不确定打开引用游标是否是您真正需要的,或者通过立即执行进行批量收集是否可行对你更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    相关资源
    最近更新 更多