【问题标题】:oracle sql varray contains an elementoracle sql varray 包含一个元素
【发布时间】:2015-08-04 04:43:24
【问题描述】:

我有这样的类型声明:

  FUNCTION ...
  IS 
     TYPE stati_va IS VARRAY (10000) OF varchar(1);
     stati       stati_va;
     v_counter   INTEGER  := 0;
  BEGIN
      stati := stati_va ();

      --this is actually in a loop so the array contains more values
      v_counter := v_counter + 1;
      stati.EXTEND;
      stati (v_counter) := '4';


      --here I would like to determine if the array 'stati' contains a value

到目前为止,我已经尝试了以下方法,但这给了我一个错误

      IF '4' member of stati then  <- COMPILE error
      IF '4' IN stati then         <- COMPILE error

我知道循环遍历数组是可能的,但这有点不方便,因为我需要构建这样的东西:

     IF array contains '4' then
     elsif array contains '3' then
     elseif array contains '2' then
     ...

【问题讨论】:

    标签: oracle plsql varray


    【解决方案1】:

    你可以使用条件:

    IF 'element' member OF <my_array> THEN
    

    例如,

    SQL> SET SERVEROUTPUT ON
    SQL> DECLARE
      2  TYPE v_array
      3  IS
      4    TABLE OF VARCHAR2(200);
      5    my_array v_array;
      6  BEGIN
      7    my_array := v_array('1','2','3','4');
      8    IF '4' member OF my_array THEN
      9      dbms_output.put_line('yes');
     10    ELSE
     11      dbms_output.put_line('no');
     12    END IF;
     13  END;
     14  /
    yes
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      你不能在没有循环的情况下使用 VARRAY。

      可以用关联表来完成:

      DECLARE TYPE stati_va IS TABLE OF NUMBER INDEX BY binary_integer; l_array stati_va; BEGIN FOR i IN 1 .. 1000 LOOP l_array(i) := dbms_random.random; END LOOP;

      IF (l_array.exists(4))
      THEN
          dbms_output.put_line(l_array(4));
      END IF;
      
      IF (l_array.exists(234234))
      THEN
          dbms_output.put_line('index exists');
      ELSE
          dbms_output.put_line('index doesnt' exist');
      END IF;
      

      结束; /

      你可以使用 binary_integer 或 varchar2 作为这个数组的键,任何值都可以

      编辑: 我忘记了 member 语法。由于它在 sql(select 语句)中的行为很奇怪,我们已经在我们的团队中禁止它

      它会是(使用可变数组或嵌套表) 如果数组的关键成员则...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 2014-05-02
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多