postgresql PLPGSQL过程中绑定变量个数未知的动态SQL

68bkxrlz  于 12个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(163)

我正在将Oracle数据库应用程序重写为PostgreSQL。在那里动态创建扩展结构。现在我正在重写使用Oracle dbms_sql创建和维护动态SQL的过程。动态SQL被构造,然后在循环中添加变量(未知有多少变量),然后在第二个循环中,它通过dbms_sql.bind_variable绑定这些变量。变量可以是不同的类型(anydata值)。下面是Oracle(PL/SQL)中第一个循环的示例代码片段:

v_col_id := v_cols.first;
    while v_col_id is not null loop
      if in_col_info.exists(v_col_id) then
        v_cmd := v_cmd || ',';
        v_cmd := v_cmd || ':' || in_col_info(v_col_id).name;
        v_cmd := v_cmd || ',';
        v_cmd := v_cmd || ':' ||
                 mod_com.get_pf_col_name(in_col_info(v_col_id).name);
      end if;
      v_col_id := v_cols.next(v_col_id);
    end loop;

字符串
下面是Oracle中的第二个示例代码片段,其中第二个循环将变量绑定到动态SQL,bind_anydata_value是绑定不同类型变量的过程(v_values是由binary_integer索引的anydata的关联数组):

v_cursor := dbms_sql.open_cursor;
    dbms_sql.parse(v_cursor, v_cmd, dbms_sql.native);
    v_col_id := v_cols.first;
    while v_col_id is not null loop
      if in_col_info.exists(v_col_id) then
        bind_anydata_value(v_cursor,
                           in_col_info(v_col_id),
                           v_cols(v_col_id));
        dbms_sql.bind_variable(v_cursor,
                               model_common.get_pf_col_name(in_col_info(v_col_id).name),
                               -1);
      end if;
      v_col_id := v_cols.next(v_col_id);
    end loop;
  
    v_result := dbms_sql.execute(v_cursor);


我只展示了一些简化的代码片段。我想通过这个来说明,我有一个问题。我不知道如何在PostgreSQL中绑定未知数量的变量。
我把PostgreSQL中的anydata变量数组换成了jsonb数组,想用带USING子句的EXECUTE,但我觉得在USING子句中动态构造变量很可能会失败,我在论坛和网上找了很久都没有找到解决办法。
有没有可能使用EXECUTE. USING子句绑定不同数量的变量?或者有没有办法像Oracle那样直接将变量绑定到动态游标文本dbms_sql.bind_variable?也许有可能使用format函数?

z3yyvxxp

z3yyvxxp1#

PL/pgSQL无法做到这一点。如果可以使用Orafce扩展,则支持dbms_sql API https://github.com/orafce/orafce#package-dbms_sql

相关问题