1
votes

problème avec le script créant une table via la clause if

Nous essayons de construire un script qui vérifie automatiquement si une table est déjà créée et si c'est le cas, le script doit se terminer. Si la table n'est pas créée, le script doit la créer.

    Error starting at line : 3 in command -
    create table FEZ.GPS_TRACKER_DATA as select * from KAKATEL.GPS_POSITION
    else END
    Error report -
    ORA-00933: SQL command not properly ended
    00933. 00000 -  "SQL command not properly ended"
    *Cause:    
    *Action:

c'est l'erreur que nous obtenons

    case 
    if select count(*) from ALL_TAB_COLS where table_name = 'GPS_TRACKER_DATA' = 0 then
       create table AZUBI.GPS_TRACKER_DATA as select * from KAKATEL.GPS_POSITION
    else end


0 commentaires

3 Réponses :


0
votes

Cela doit être fait dans le bloc PL / SQL:

DECLARE
    V_CNT   NUMBER := 0;
BEGIN
    SELECT
        COUNT(*)
    INTO V_CNT
    FROM
        ALL_TABLES -- USE ALL_TABLES 
    WHERE
        TABLE_NAME = 'GPS_TRACKER_DATA'
        AND OWNER = 'AZUBI'; -- ADDED OWNER CONDITION

    IF V_CNT = 0 THEN
        EXECUTE IMMEDIATE 'create table AZUBI.GPS_TRACKER_DATA as 
                           select * from KAKATEL.GPS_POSITION';
    END IF;
END;
/

Cheers !!


1 commentaires

Hé, si je voulais ajouter un PK pour une colonne, comment ferais-je cela?



0
votes

Une option serait:

declare
  v_cnt pls_integer;
begin
  select count(*)
    into v_cnt
    from ALL_TAB_COLS 
   where table_name = 'GPS_TRACKER_DATA';
  case
    when v_cnt = 0 then
      execute immediate 'create table AZUBI.GPS_TRACKER_DATA as
                         select * from KAKATEL.GPS_POSITION';
  end case;
end;
/
  • exécution immédiate est nécessaire pour une instruction DDL dans un PL / SQL bloquer.
  • que l'instruction select renvoie un non négatif (et même non nul) entier pour tous les cas.

Vous pouvez remplacer if..then..end if par case..when then..end case , également:

XXX


0 commentaires

1
votes

Vous n'avez pas besoin d'interroger le dictionnaire de données pour voir si la table existe; essayez simplement de créer la table en utilisant EXECUTE IMMEDIATE et attrapez l'exception si elle existe déjà.

DECLARE
  ALREADY_EXISTS EXCEPTION;
  PRAGMA EXCEPTION_INIT( ALREADY_EXISTS, -955 );
BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE new_table AS SELECT * FROM existing_table';
EXCEPTION
  WHEN ALREADY_EXISTS THEN
    NULL;
END;
/

db fiddle ici


0 commentaires