在pl / sql f中构造一个字符串

时间:2016-05-09 19:10:11

标签: java plsql

我想循环该数组并在我的查询的NOT IN部分使用它。 问题是它返回3条记录。它应该返回2。 我的问题在于如何处理pl / sql中的数组

2 个答案:

答案 0 :(得分:0)

首先,您在java中构建的字符串最后会有一个额外的逗号。您可以使用标记

将其删除
String separator = "";
for(String s : tableNamesToExclude){
       sb.append(separator).append("'").append(s.replace("'", "''")).append("',");
       separator = ",";
}

这样,分隔符','在每个元素之前添加,但是第一个元素。

其次,最终在tablenames变量中的字符串正是您在java中构建的字符串(您可以使用dbms_output.put_line函数对其进行验证)。因此,“not in”运算符将检查是否有任何名称等于此字符串的表,这将失败。

我认为您的问题的确切解决方案在此处描述:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:110612348061

答案 1 :(得分:0)

当您标记PLSQL时,我试图说明一些可以实现所需输出的技术。希望下面片段有帮助。

var  p_ref refcursor;
SET serveroutput ON;
DECLARE
TYPE lv_var
IS
  TABLE OF VARCHAR2(100);
  lv_tab lv_var;
  lv_str VARCHAR2(100);

  --Schema level object
  lv_num NUMBER_NTT;
  --Schema level object
BEGIN
  SELECT LEVEL ||'AV' BULK COLLECT INTO lv_tab FROM DUAL CONNECT BY LEVEL < 10;
  --There are two ways in whcih you can loop
  -- 1 Just try to make a string whcih can be used in IN clause
  FOR I IN lv_tab.FIRST..lv_tab.LAST
  LOOP
    lv_str:=lv_str||','''||lv_tab(i)||'''';
  END LOOP;
  dbms_output.put_line(SUBSTR(lv_str,2,LENGTH(lv_str)));
  --This lv_str can be used in any NOT IN condition
  --2 WAY is bit more efficient but here in this case you wont bwe able to do it via PLSQL object. We need
  --  to create a schema level nested table object then then use it in NOT IN clause
  SELECT LEVEL BULK COLLECT
  INTO lv_num
  FROM DUAL
    CONNECT BY LEVEL < 2;
  OPEN :p_ref FOR SELECT * FROM
  (SELECT 1 NM FROM DUAL
  UNION
  SELECT 2 NM FROM DUAL
  UNION
  SELECT 3 NM FROM DUAL
  )A WHERE A.NM NOT IN
  (SELECT COLUMN_VALUE FROM TABLE(lv_num)
  );
END;
print p_ref;