Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Oracle:Query Paramterized dengan klausa IN mengembalikan nilai nol

Anda dapat meneruskan daftar yang dipisahkan koma sebagai parameter (variabel pengikat), tetapi Anda bertanggung jawab untuk menguraikannya dalam subkueri. Solusi berdasarkan utas ini menggunakan regexp_substr.

CREATE or REPLACE PROCEDURE p_getdata(A IN VARCHaR2, cur OUT sys_refcursor)
AS
BEGIN
open cur for  'with t1 as (select :A col from dual),
     t2 as (select level lvl,to_number(regexp_substr(col,''[^,]+'', 1, level)) col 
              from t1 connect by regexp_substr(col, ''[^,]+'', 1, level) is not null)
select col as id from t2' using A;
END;
/

Prosedurnya disederhanakan, tetapi harus memberikan perasaan bagaimana menggunakannya.

Keuntungan besar terhadap penggunaan SQL dinamis (penggabungan string) adalah Anda tidak perlu mengurai pernyataan pada setiap eksekusi. Belum lagi keamanannya (takut akan injeksi SQL).

Penggunaan:

DECLARE 
  l_cur SYS_REFCURSOR;
  l_id NUMBER;
BEGIN 
  p_getdata('1,1000,282828,4',l_cur);
 LOOP
    FETCH l_cur INTO l_id ;
    EXIT WHEN l_cur%NOTFOUND;
    dbms_output.put_line(l_id);
 END LOOP;
END;
/


1
1000
282828
4

PERBARUI

Prosedur di atas disederhanakan, untuk mendapatkan fungsionalitas Anda, Anda harus menggunakan kueri seperti ini di CURSOR (yaitu, pertama-tama pisahkan ketiga parameter dalam subkueri terpisah menggunakan pemfaktoran subkueri, lalu terapkan hasil dalam kueri Anda)

CREATE or REPLACE PROCEDURE p_getdata(A IN VARCHAR2, B in VARCHAR2, c in VARCHAR2, cur OUT sys_refcursor)
AS
BEGIN
open cur for  'with ta1 as (select :A col from dual),
     ta2 as (select level lvl,to_number(regexp_substr(col,''[^,]+'', 1, level)) col 
              from ta1 connect by regexp_substr(col, ''[^,]+'', 1, level) is not null),
 tb1 as (select :B col from dual),
     tb2 as (select level lvl,to_number(regexp_substr(col,''[^,]+'', 1, level)) col 
              from tb1 connect by regexp_substr(col, ''[^,]+'', 1, level) is not null),
 tc1 as (select :C col from dual),
     tc2 as (select level lvl,to_number(regexp_substr(col,''[^,]+'', 1, level)) col 
              from tc1 connect by regexp_substr(col, ''[^,]+'', 1, level) is not null)              
select firstname, lastname, streetname, city
from mytable 
where zip IN (select col from ta2) AND 
      streetnumber IN (select col from tb2) AND 
      apt_num in (select col from tc2)' using A, B, C;
END;
/

tes lulus

DECLARE 
  l_cur SYS_REFCURSOR;
  l_firstname VARCHAR2(20);
  l_lastname VARCHAR2(20);
  l_streetname VARCHAR2(20);
  l_city VARCHAR2(20);
BEGIN 
  p_getdata('1100,,1200','1,2','11,12' ,l_cur);
 LOOP
    FETCH l_cur INTO l_firstname, l_lastname, l_streetname, l_city;
    EXIT WHEN l_cur%NOTFOUND;
    dbms_output.put_line(l_firstname|| ' ' || l_lastname || ' ' || l_streetname  || ' ' || l_city);
 END LOOP;
END;
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memilih dari tabel yang sama lebih dari sekali dalam kueri yang sama

  2. Periksa nilai di baris MySQL

  3. Apa yang setara dengan kueri MySQL dari PHP strip_tags?

  4. variabel php dalam nama baris MySQL

  5. Apa nilai default yang benar untuk bidang desimal MySQL?