Hello,
I wanted to take a moment here and reach out to the community with a question. How does postgreSQL handle schema switching in the database? I have a test scenario.
##################
vpn2=> show search_path;
search_path
-------------
mridul
(1 row)
CREATE OR REPLACE PACKAGE mridul.TEST_PKG
IS
PROCEDURE execute_for_all_schema();
end TEST_PKG;
CREATE OR REPLACE PACKAGE BODY mridul.TEST_PKG
IS
PROCEDURE execute_for_all_schema() IS
CURSOR c_schema_names IS
SELECT name
FROM mridul.schema_config
WHERE status = 'ACTIVE';
BEGIN
FOR dat_schema_names IN c_schema_names LOOP
----- EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = '|| dat_schema_names.name;
EXECUTE IMMEDIATE 'SET SEARCH_PATH = '|| dat_schema_names.name;
EXECUTE IMMEDIATE 'insert into A values (1)';
commit;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
end TEST_PKG;
vpn2=> select * from mridul.schema_config;
id | name | description | status | last_device_sync_date
----+-------+-------------+--------+-----------------------
1 | TEST | TESTING | ACTIVE | 22-SEP-11 18:28:11
6 | TEST1 | TESTING5 | ACTIVE | 22-SEP-11 11:46:09
2 | TEST2 | TESTING2 | ACTIVE | 23-SEP-11 11:54:35
(3 rows)
vpn2=> show search_path;
search_path
-------------
mridul
(1 row)
vpn2=> select count(*) from test.a;
count
-------
0
(1 row)
vpn2=> select count(*) from test1.a;
count
-------
0
(1 row)
vpn2=> select count(*) from test2.a;
count
-------
0
(1 row)
vpn2=> exec mridul.TEST_PKG.execute_for_all_schema;
EDB-SPL Procedure successfully completed
vpn2=> select count(*) from test.a;
count
-------
1
(1 row)
vpn2=> select count(*) from test1.a;
count
-------
1
(1 row)
vpn2=> select count(*) from test2.a;
count
-------
1
(1 row)
If I convert the 'insert into A ...' part from a dynamic dml to a
normal insert, and then execute the procedure, there are 3 rows inserted
into test.a and none go into test1.a nor test2.a. However, if I echo
the search_path after executing the proc, it displays the last schema's
name (meaning, it has switched the schemas, but the insert has gone into
only the first schema).
Thanks in advance!
-Mridul.