简体   繁体   中英

How to pass String values through variable in VARRAY functions in PL/SQL

How to pass String values through variable in VARRAY functions in PL/SQL.

Coding:

create or replace
PROCEDURE dynamic_query_build
(
    vr_plan_sku_id     IN VARCHAR2
)
IS
  type plan_sku_id_array IS VARRAY(999) OF VARCHAR2(5000);
  plan_sku_id plan_sku_id_array;
  total integer;
  vrx_plan_sku_id VARCHAR2(3000);

BEGIN
  vrx_plan_sku_id:= replace(vr_plan_sku_id,',',chr(39)||','||chr(39));
  vrx_plan_sku_id:=chr(39)||vrx_plan_sku_id||chr(39);
  --plan_sku_id := plan_sku_id_array('Apple','Apple','Orange','Banana');
  dbms_output.put_line(vrx_plan_sku_id);
  plan_sku_id := plan_sku_id_array(vrx_plan_sku_id);

  total := plan_sku_id.count;
  dbms_output.put_line('Array count: 'total);

EXCEPTION
    WHEN OTHERS THEN
    raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END dynamic_query_build;

Execution:

set serveroutput on;
declare
vr_plan_sku_id varchar2(200) := 'Apple,Apple,Orange,Banana';
BEGIN
   dynamic_query_build(vr_plan_sku_id);
END;
/

My Output:

Array count: 1

Expected Output:

Array count: 4

Explanation: When i pass the string values like "plan_sku_id_array('Apple','Apple','Orange','Banana')" then i am getting count values is 4.. But when i pass the same string through variables then it is considering whole value as single value in the varray.

You need to substring your input parameter (based on , ) and then do something like this post (eg call EXTEND(); then ary(count)= value ). Keep extending and adding as long as you still have some value in your input parameter

Can pass your value string like in given below way. This would convert entire comma separated string in different rows and you can run a loop and store variables in VARRAY.

 SELECT trim(x.column_value.extract('e/text()')) COLUMNS
 from t t, table (xmlsequence(xmltype('<e><e>' || replace(valuestring,':','</e><e>')||  
 '</e></e>').extract('e/e'))) x   );

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM