การส่งค่าที่คั่นด้วยเครื่องหมายจุลภาคไปยังส่วนคำสั่ง WHERE ในขั้นตอนการจัดเก็บของ oracle [ซ้ำกัน]

ฉันกำลังส่งค่าพารามิเตอร์ที่คั่นด้วยเครื่องหมายจุลภาคไปยังขั้นตอนการจัดเก็บใน Oracle พารามิเตอร์ไปที่ส่วนคำสั่ง WHERE ฉันกำลังพยายามทำสิ่งนี้:

valuestring = "ABC123, ABC456, ABC789"



SELECT * 
  FROM Tbl1 
  WHERE column IN (valuestring)

ปัญหาคือคำสั่ง select ไม่รู้จักเครื่องหมายจุลภาคที่อยู่ระหว่างค่า ซึ่งใช้เป็นสตริงเดี่ยว ดังนั้นเมื่อดำเนินการกระบวนงานที่เก็บไว้ จะไม่ส่งคืนค่าใด ๆ

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


person user1783490    schedule 27.07.2013    source แหล่งที่มา
comment
คุณได้พิจารณาข้อความค้นหาแบบไดนามิกแล้วหรือยัง? หรือบางทีนี่อาจช่วยได้ stackoverflow.com/questions/242771/   -  person unlimit    schedule 27.07.2013
comment
นั่นคือแนวทางถัดไปที่ฉันคิดไว้   -  person user1783490    schedule 27.07.2013


คำตอบ (2)


ตามหลักการแล้ว แทนที่จะส่งผ่านสตริงเดียวที่ประกอบด้วยค่าที่คั่นด้วยเครื่องหมายจุลภาค คุณจะส่งผ่านเป็นคอลเลกชัน หากคุณมีสิ่งที่ชอบ

CREATE TYPE value_tbl AS TABLE OF VARCHAR2(10);

จากนั้นคุณก็สามารถส่งคอลเลกชันนั้นไปยังขั้นตอนของคุณและใช้ใน WHERE clause ได้

CREATE OR REPLACE PROCEDURE procedure_name( p_values IN value_tbl )
AS
  ...
BEGIN
  FOR i IN (SELECT *
              FROM table_name
             WHERE column_name IN (SELECT *
                                     FROM TABLE( p_values )))
  LOOP
    ...
  END LOOP;
END;

หากคุณต้องการส่งสตริงที่คั่นด้วยเครื่องหมายจุลภาคจริงๆ คุณสามารถกำหนดประเภทคอลเลกชันเดียวกัน จากนั้นแยกวิเคราะห์สตริงเพื่อเติมคอลเลกชันโดยใช้บางอย่างเช่น ฟังก์ชัน str2tbl ของ Tom Kyte แต่นั่นจะมีประสิทธิภาพน้อยกว่าการส่งผ่านคอลเลกชันตั้งแต่แรก

person Justin Cave    schedule 27.07.2013
comment
ต้องมีเหตุผลว่าทำไมคำถามนี้ถึงเกิดขึ้นบ่อยครั้ง หากส่วนหน้าเป็น VB.net คงจะไม่ใช่แอปรุ่นเก่า บางทีนักพัฒนาสมัยใหม่อาจเพียงเรียนรู้วิธีเชื่อมโยงค่าต่างๆ และไม่เคยสงสัยว่าจะมีวิธีที่ดีกว่าในการจัดการกับค่าหลายค่าหรือไม่ - person APC; 27.07.2013

สามารถส่งผ่านสตริงค่าของคุณได้ตามวิธีด้านล่าง วิธีนี้จะแปลงสตริงที่คั่นด้วยเครื่องหมายจุลภาคทั้งหมดในแถวต่างๆ และด้วยเหตุนี้จึงใช้งานง่ายทุกที่ที่คุณต้องการ

 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   );
person Harshit    schedule 27.07.2013