Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Problem w dynamicznym tworzeniu tabeli

Najprostszym rozwiązaniem byłoby usunięcie końcowego przecinka na końcu:

dbms_output.put_line(rtrim(lsql,',') || ' )');

Wygląda na to, że procedurę można uprościć do:

create or replace procedure p1(p_table_nm in varchar2)
is
    l_sql long := 'create table ' || p_table_nm || chr(10);
    l_colsep varchar2(2) := '( ';  -- changes to comma after first item
begin
    for rc1 in (
        select * from t1
        where  table_name = p_table_nm
    )
    loop
        l_sql := l_sql || l_colsep || rc1.column_name || ' ' || rc1.datatype ||
            case
                when rc1.column_width is not null then '(' || rc1.column_width || ')'
            end;

        if rc1.is_null = 'N' then  -- Changed from 'Y' - check requirement
            l_sql := l_sql || ' NOT NULL';
        end if;

        l_sql := l_sql || chr(10);
        l_colsep := ', ';
    end loop;

    dbms_output.put_line(rtrim(l_sql,chr(10)) || ' )');
end;

Daje to wynik taki:

create table TEST
( FNAME VARCHAR2(10) 
, LNAME VARCHAR2(10) NOT NULL
, STARTDATE DATE NOT NULL )

Czy planujesz obsługiwać wartości domyślne, wygenerowane identyfikatory, kolumny wirtualne lub dowolną określoną kolejność kolumn?

Czy jesteś również pewien, że rc1.is_null = 'Y'? oznacza, że ​​kolumna jest obowiązkowa? Wygląda na odwrót.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przegrody i High Water Mark w Oracle

  2. Jak stworzyć widok w Oracle

  3. Kluczowe zmiany technologiczne w E-Business Suite 12.2

  4. czy możemy wykonać polecenie uniksowe z procedury oracle10g?

  5. Procedura pobrania pliku z podanego adresu URL w Oracle 11g i zapisania go w kolumnie typu blob