Sql 如何在oracle中为字符串分配多个值
我想将多个值赋给一个变量,并在where子句中使用该变量 例如:Sql 如何在oracle中为字符串分配多个值,sql,oracle,Sql,Oracle,我想将多个值赋给一个变量,并在where子句中使用该变量 例如: declare v_filename varchar2(300) := ''('filename1','filename2')''; cnt number; begin select count(*) into cnt from table_name where filename in v_filename; end; 请告知 谢谢, Deepak您必须将整个查询放入一个字符串中,然后使用
declare
v_filename varchar2(300) := ''('filename1','filename2')'';
cnt number;
begin
select count(*) into cnt from table_name
where filename in v_filename;
end;
请告知
谢谢,
Deepak您必须将整个查询放入一个字符串中,然后使用
执行立即数
()执行该字符串。除了“执行立即数”,您还可以使用like,例如
declare
v_filename varchar2(300) := '(''filename1'',''filename2'')';
cnt number;
begin
select count(*) into cnt from table_name
where v_filename like '%'''||filename||'''%';
end;
请注意,v_文件名中的parentese和逗号仅用于人类可读性。这决不是一个完美的解决方案,因为它假定表中的文件名不包含某些特殊字符;如果文件名列上有索引(不是这样使用的),性能也会很差。我建议阅读
executeimmediate
也是一种可能性,但如果您不签入字符串,我不建议使用它
刚才在quick上写道(使用了“动态输入列表”中介绍的第一种方法):
你基本上有两个选择。 1.使用动态查询 2.使用集合
CREATE OR REPLACE TYPE t_varchar_tab AS TABLE OF VARCHAR2 (4000);
CREATE OR REPLACE FUNCTION in_list (p_in_list IN VARCHAR2) RETURN t_varchar_tab
AS
l_tab t_varchar_tab := t_varchar_tab();
l_text VARCHAR2(32767) := p_in_list || ',';
l_idx NUMBER;
BEGIN
LOOP
l_idx := INSTR(l_text, ',');
EXIT WHEN NVL(l_idx, 0) = 0;
l_tab.extend;
l_tab(l_tab.last) := TRIM(SUBSTR(l_text, 1, l_idx - 1));
l_text := SUBSTR(l_text, l_idx + 1);
END LOOP;
RETURN l_tab;
END;
SELECT * FROM TABLE(in_list('filename1,filename2'));
SELECT COUNT(*) INTO cnt FROM table_name WHERE filename IN (SELECT * FROM TABLE(in_list(v_filename)));
DECLARE
v_filename VARCHAR2(300) := '(''ALL_VIEWS'', ''ALL_TABLES'')';
--double quotes inside a string
cnt NUMBER;
BEGIN
execute immediate 'SELECT COUNT(*) INTO :cnt FROM all_views
WHERE view_name IN ' || v_filename
into cnt;
dbms_output.put_line('counted: ' || cnt);
END;
/
create type tt_strings as table of varchar2(30);
declare
cnt NUMBER;
v_condition tt_strings;
begin
v_condition := tt_strings();
v_condition.extend;
v_condition(1) := 'ALL_VIEWS';
v_condition.extend;
v_condition(2) := 'ALL_TABLES';
SELECT COUNT(*)
INTO cnt
FROM all_views o, TABLE(v_condition) x
WHERE x.column_value = o.VIEW_NAME;
dbms_output.put_line('counted: ' || cnt);
end;
/