RE: for loop

Поиск
Список
Период
Сортировка
От Igor Neyman
Тема RE: for loop
Дата
Msg-id DM5PR17MB15326F3D106F39140A34D844DAC40@DM5PR17MB1532.namprd17.prod.outlook.com
обсуждение исходный текст
Ответ на RE: for loop  (Igor Neyman <ineyman@perceptron.com>)
Список pgsql-admin

 

From: Igor Neyman [mailto:ineyman@perceptron.com]
Sent: Wednesday, November 07, 2018 1:47 PM
To: Pepe TD Vo <pepevo@yahoo.com>; Pgsql-admin <pgsql-admin@postgresql.org>
Subject: RE: for loop

 

WARNING: This email originated from outside of Perceptron! Please be mindful of PHISHING and MALWARE risks.

From: Pepe TD Vo [mailto:pepevo@yahoo.com]
Sent: Wednesday, November 07, 2018 1:34 PM
To: Pgsql-admin <pgsql-admin@postgresql.org>
Subject: for loop

 

I have a script migrating from oracle to Postgres.  I have checked online and don't see anything wrong on for ... loop statement.  Would you please tell me what is wrong where?

 

CREATE OR REPLACE FUNCTION "CIDRDBA"."CIDRDBA_CONSTRAINTS" ( val in varchar(4000) ) RETURNS VOID

as $$

begin

        if val = 'DISABLE' then

                raise notice '%', 'CIDRDBA Constarints are being disabled';

                for c in ( select table_name, constraint_name from information_schema.table_constraints

                        where constraint_type = 'R' )

                loop

                        raise notice '%', 'Processing table: ' || c.table_name || ' - constraint

' || c.constraint_name;

                        execute immediate 'alter table ' || c.table_name ||' ' || val || ' constraint

 ' ||

                                c.constraint_name ;

                end loop;

                for c in ( select table_name, constraint_name from information_schema.table_constraints

                        where constraint_type = 'P' )

                loop

                        raise notice '%', 'Processing table: ' || c.table_name || ' - constraint

' || c.constraint_name;

                        execute immediate 'alter table ' || c.table_name || ' ' || val || ' constrain

t ' ||

                                c.constraint_name ;

                end loop;

        elsif val = 'ENABLE' then

                raise notice '%', 'CIDRDBA Constarints are being enabled';

                for c in ( select table_name, constraint_name from information_schema.table_constraints

                        where constraint_type = 'P' )

                loop

                        raise notice '%', 'Processing table: ' || c.table_name || ' - constraint

' || c.constraint_name;

                        execute immediate 'alter table ' || c.table_name ||' ' || val || ' constraint

 ' ||

                                c.constraint_name ;

                end loop;

                for c in ( select table_name, constraint_name from information_schema.table_constraints

                        where constraint_type = 'R' )

                loop

                        raise notice '%', 'Processing table: ' || c.table_name || ' - constraint

' || c.constraint_name;

                        execute immediate 'alter table ' || c.table_name || ' ' || val || ' constrain

t ' ||

                                c.constraint_name ;

                end loop;

        else

                raise notice '%', 'CIDRDBA nothing to do';

        end if;

end;

$$ LANGUAGE plpgsql;

 

 

ERROR:  loop variable of loop over rows must be a record or row variable or list of scalar variables

LINE 6:                 for c in ( select table_name, constraint_nam...

                            ^

SQL state: 42601

Character: 238

 

 

Bach-Nga

 

Exactly what it says in error message: you need to declare loop variable:

 

DECLARE c record;

BEGIN

………

 

Now, your next error will be about “execute immediate”. There is no such command in Postgres PlPgSQL. You just do “execute” for dynamic sql.

 

So, in short, you need to read Postgres docs to learn about the differences between Oracle’s PlSQL and Postgres PlPgSQL.

 

Regards,

Igor Neyman

 

Oops… Wrong about “execute immediate” – it is supported.

But, not wrong about reading documentation on PlPgSQL.

 

Igor N.

В списке pgsql-admin по дате отправления:

Предыдущее
От: Igor Neyman
Дата:
Сообщение: RE: for loop
Следующее
От: Ron
Дата:
Сообщение: Re: query can't merge into table of the other schema