【问题标题】:Dynamic sql statement - depending on numbers of variables动态 sql 语句 - 取决于变量的数量
【发布时间】:2018-04-07 16:33:42
【问题描述】:

我的问题是我正在尝试构建一个 SELECT 语句,这将取决于我将传递给它们的变量数量。

重要的是要知道我使用的是 Oracle 数据库。

有没有什么有效的方法来建立这样的声明?

例如 我有三个可以传递给数据库的变量(与“AND”关键字连接),它应该给我一个独特的结果。 opt1 - (WHERE var1=x AND var2=y AND var3=z)

但也有一个选项,我将只传递两个变量并获得结果 选择 2 - WHERE var1=x AND var2=y) 一个变量或无,并从数据库中获取每条记录。

我不想构建无数种不同的选择语句。必须有一种优雅的方式。

PS。这是与 webmethods 中的 JDBC 适配器有关的问题。也许有人知道如何在这种环境下解决这个问题?

【问题讨论】:

  • 你需要传递一个数组并循环遍历它。查看oracle中的owa_util.ident_arr数据结构。从数组的 1..length 循环并构建 sql,然后执行它。在数组中存储 'col1=x'、'col2=y' 等
  • 有更简单的方法吗?我很害怕我希望能够以数组形式在我的 webmethods 环境中传递变量。也许有一个选项,例如:检查变量是否为空并实现适当的逻辑?
  • 查看webmethods的文档,通常我希望它支持某种数组参数。
  • 如果要传递的变量个数未知,那么一定是数组。我在一个以这种方式构建查询的地方工作。每个 pl/sql 报告都采用了这个数组

标签: sql oracle select dynamic-sql webmethods


【解决方案1】:

您可以使用关联的数组来存储和检索元素。这里我已经向您展示了如何构造查询。您可以使用cursor 或其他选项来执行它。您可以将此扩展为过程以将变量数组作为参数传递。 请参阅 Passing an associative array as a parameter between packages 了解此类实施。

SET SERVEROUTPUT ON;
DECLARE
TYPE where_elems
IS
  TABLE OF VARCHAR2 (100) INDEX BY VARCHAR2 (30);
  wh where_elems;
  v_query VARCHAR2 (4000) := 'SELECT col , col2 FROM yourtable where 1=1 ';
  v_idx   VARCHAR2 (30);
BEGIN
  wh ('col3')  := 'value3'; --you can initialize and call a procedure with array as argument.
  wh ('col4')  := 'value4';
  v_idx        := wh.FIRST;

  WHILE (v_idx IS NOT NULL)
  LOOP
    v_query := v_query || ' AND ' || v_idx || ' = ' || wh (v_idx);
    v_idx   := wh.NEXT (v_idx);
  END LOOP;
  DBMS_OUTPUT.PUT_LINE (v_query);
END;
/

输出

SELECT col , col2 FROM yourtable where 1=1  AND col3 = value3 AND col4 = value4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多