Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORA-01027 :les variables de liaison ne sont pas autorisées pour la définition des données lors de la tentative d'utilisation de if elseif

Comme l'indique l'erreur, vous ne pouvez pas utiliser de variables de liaison ici, vous devez donc concaténer :

create or replace procedure create_dates_testing 
    ( dummy_variable varchar2 default to_char(sysdate,'YYYYMMDD') )
as
    day_of_month varchar2(255) := extract(day from sysdate);
    today varchar2(255) := to_char(sysdate +1, 'fmDAY', 'nls_date_language = English');
    start_date date;
    next_start_date date;
begin
    if today = 'SUNDAY' then
        -- select yesterday
        start_date      := trunc(sysdate) - interval '1' day;
        next_start_date := trunc(sysdate);

    elsif day_of_month = 3 then
        -- select the whole of last month
        start_date      := trunc(sysdate, 'MM') - interval '1' month;
        next_start_date := trunc(sysdate, 'MM') - interval '1' month;
    else
        return;
    end if;

    execute immediate 'drop table new_customers';

    execute immediate 'create table new_customers as 
    select id, client_name, invoice_date 
    from clients table
    where transactiondate >= date '''  || to_char(start_date,'YYYY-MM-DD') ||
    ''' and transactiondate < date ''' || to_char(next_start_date,'YYYY-MM-DD') ||'''';

end create_dates_testing;

Vraisemblablement, il y aura un peu plus de code pour gérer le cas où ce n'est ni dimanche ni le troisième du mois, ou les new_customers la table n'existe pas.

Edit :ajout de else condition pour mettre fin au traitement si aucune des conditions de date n'est remplie.