我想循环该数组并在我的查询的NOT IN部分使用它。 问题是它返回3条记录。它应该返回2。 我的问题在于如何处理pl / sql中的数组
答案 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;