Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

daftar untuk mengikat variabel di SQL Developer

Masalahnya adalah dbms_utility.comma_to_table prosedur membutuhkan elemen daftar untuk menjadi pengidentifikasi Oracle yang valid, meskipun itu tidak dijelaskan dalam dokumen sebenarnya. Artikel AskTom ini merujuk padanya, melalui name_tokenize prosedur :

Ini tidak ada hubungannya dengan pengikatan atau Pengembang SQL, ini adalah pembatasan basis data.

Anda dapat melihat jenis kesalahan yang sama jika Anda memanggil dbms_utility.comma_to_table prosedur secara langsung:

declare
  arr dbms_utility.uncl_array;
  len binary_integer;
begin
  dbms_utility.comma_to_table('USER', len, arr);
end;
/

Error report -
ORA-20001: comma-separated list invalid near R
ORA-06512: at "SYS.DBMS_UTILITY", line 236
ORA-06512: at "SYS.DBMS_UTILITY", line 256
ORA-06512: at line 5

Atau dengan memanggil dbms_utility.name_tokenize langsung:

declare
  a varchar2(30);
  b varchar2(30);
  c varchar2(30);
  d varchar2(30);
  e binary_integer;
begin
  dbms_utility.name_tokenize('USER', a, b, c, d, e);
end;
/

Error report -
ORA-00931: missing identifier
ORA-06512: at "SYS.DBMS_UTILITY", line 167
ORA-06512: at line 8
00931. 00000 -  "missing identifier"

Anda tidak dapat menggunakan ini jika nilai yang dipisahkan koma adalah kata-kata khusus atau tidak diizinkan sebagai pengenal karena alasan lain; dimulai dengan angka, misalnya. Anda akan mendapatkan masalah yang sama jika daftar berisi TABLE atau 42TAB . Sebenarnya bukan ini yang dimaksudkan, seperti yang disebutkan Tom.

Anda dapat mengatasi sebagian pembatasan dengan memaksa semua elemen untuk dikutip ganda, yang dapat Anda lakukan dengan replace . dan kemudian salah satu dari contoh tersebut diperbolehkan:

declare
  arr dbms_utility.uncl_array;
  len binary_integer;
begin
  dbms_utility.comma_to_table('"USER","TABLE","42TAB"', len, arr);
end;
/

anonymous block completed

Jadi untuk kode Anda, ubah iv_raw saat Anda meneruskannya, lalu hapus tanda kutip ganda dari setiap nilai yang dikembalikan:

FUNCTION comma_to_table(iv_raw IN VARCHAR2)
  RETURN bind_tab_typ
  PIPELINED
  IS
     ltab_lname dbms_utility.lname_array;
     ln_len     BINARY_INTEGER;
  BEGIN
     dbms_utility.comma_to_table(list   => '"' || replace(iv_raw, ',', '","') || '"'
                                ,tablen => ln_len
                                ,tab    => ltab_lname);
     FOR i IN 1 .. ln_len LOOP
        PIPE ROW (replace(ltab_lname(i), '"'));
     END LOOP;
  END comma_to_table;

Maka ini berhasil:

select * from table(ui_util.comma_to_table('USER,TABLE,42T'));

COLUMN_VALUE
--------------------
USER
TABLE
42T

Tetapi Anda masih dibatasi untuk setiap elemen yang terdiri dari 30 karakter atau kurang, karena itu adalah batasan untuk pengenal yang dikutip.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle menggunakan LIKE '%' pada DATE

  2. Dapatkan jumlah nilai kolom tertentu di Oracle dengan gabungan dalam

  3. baca 1kb pertama dari gumpalan dari Oracle

  4. PLS-00201 - pengenal harus dideklarasikan

  5. Penggabungan Oracle CTE