Mengirim nilai yang dibatasi koma ke klausa WHERE dalam prosedur tersimpan Oracle [duplikat]

Saya mengirimkan nilai parameter yang dibatasi koma ke prosedur tersimpan di Oracle. Parameternya masuk ke klausa WHERE, saya mencoba mencapai sesuatu seperti ini:

valuestring = "ABC123, ABC456, ABC789"



SELECT * 
  FROM Tbl1 
  WHERE column IN (valuestring)

Masalahnya adalah pernyataan pilih tidak mengenali koma di antara nilai, ia menganggapnya sebagai string tunggal sehingga ketika prosedur tersimpan dijalankan, ia tidak mengembalikan nilai.

Bantuan apa pun akan dihargai.


person user1783490    schedule 27.07.2013    source sumber
comment
Sudahkah Anda mempertimbangkan kueri dinamis? Atau mungkin ini akan membantu stackoverflow.com/questions/242771/   -  person unlimit    schedule 27.07.2013
comment
itulah pendekatan berikutnya yang ada dalam pikiran saya   -  person user1783490    schedule 27.07.2013


Jawaban (2)


Idealnya, daripada meneruskan satu string yang terdiri dari nilai yang dipisahkan koma, Anda akan meneruskan sebuah koleksi. Jika Anda memiliki sesuatu seperti

CREATE TYPE value_tbl AS TABLE OF VARCHAR2(10);

maka Anda dapat meneruskan koleksi itu ke dalam prosedur Anda dan menggunakannya dalam klausa WHERE

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;

Jika Anda benar-benar perlu memasukkan string yang dipisahkan koma, Anda dapat menentukan jenis koleksi yang sama dan kemudian mengurai string untuk mengisi koleksi menggunakan sesuatu seperti Fungsi str2tbl Tom Kyte. Tapi itu akan menjadi kurang efisien dibandingkan meneruskan koleksi untuk memulai.

person Justin Cave    schedule 27.07.2013
comment
Pasti ada alasannya mengapa pertanyaan ini sering muncul. Jika front endnya adalah VB.net mungkin itu bukan aplikasi lama. Mungkin pengembang modern hanya belajar cara menggabungkan nilai dan tidak pernah bertanya-tanya apakah ada cara yang lebih baik untuk menangani banyak nilai? - person APC; 27.07.2013

Dapat meneruskan string nilai Anda seperti yang diberikan di bawah ini. Ini akan mengonversi seluruh string yang dipisahkan koma di baris berbeda dan karenanya akan mudah digunakan di mana pun Anda mau.

 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