Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在oracle中为字符串分配多个值_Sql_Oracle - Fatal编程技术网

Sql 如何在oracle中为字符串分配多个值

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您必须将整个查询放入一个字符串中,然后使用

我想将多个值赋给一个变量,并在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

您必须将整个查询放入一个字符串中,然后使用
执行立即数
()执行该字符串。

除了“执行立即数”,您还可以使用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.使用集合

  • 使用动态查询,您可以在运行时动态构造查询,然后运行它:
  • 优点:易于编写,特别是对于短查询,速度快 缺点:在错误地将用户输入粘贴到查询字符串中时,可能会进行SQL注入,每次更改文件名列表时都会进行硬解析

  • 使用集合。创建一个集合类型,然后填充它并将其用作伪表
  • 优点:安全、可维护,适用于包含2个以上元素的大型集合 Disadvatages:您需要创建一个类型,更难编码(起初),速度稍慢一点(在99%的情况下这并不重要)

    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;
    /