gpcontrib/orafce/sql/dbms_sql.sql (247 lines of code) (raw):
do $$
declare
c int;
strval varchar;
intval int;
nrows int default 30;
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'select ''ahoj'' || i, i from generate_series(1, :nrows) g(i)');
call dbms_sql.bind_variable(c, 'nrows', nrows);
call dbms_sql.define_column(c, 1, strval);
call dbms_sql.define_column(c, 2, intval);
perform dbms_sql.execute(c);
while dbms_sql.fetch_rows(c) > 0
loop
call dbms_sql.column_value(c, 1, strval);
call dbms_sql.column_value(c, 2, intval);
raise notice 'c1: %, c2: %', strval, intval;
end loop;
call dbms_sql.close_cursor(c);
end;
$$;
do $$
declare
c int;
strval varchar;
intval int;
nrows int default 30;
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'select ''ahoj'' || i, i from generate_series(1, :nrows) g(i)');
call dbms_sql.bind_variable(c, 'nrows', nrows);
call dbms_sql.define_column(c, 1, strval);
call dbms_sql.define_column(c, 2, intval);
perform dbms_sql.execute(c);
while dbms_sql.fetch_rows(c) > 0
loop
strval := dbms_sql.column_value_f(c, 1, strval);
intval := dbms_sql.column_value_f(c, 2, intval);
raise notice 'c1: %, c2: %', strval, intval;
end loop;
call dbms_sql.close_cursor(c);
end;
$$;
drop table if exists foo;
create table foo(a int, b varchar, c numeric);
do $$
declare c int;
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'insert into foo values(:a, :b, :c)');
for i in 1..100
loop
call dbms_sql.bind_variable(c, 'a', i);
call dbms_sql.bind_variable(c, 'b', 'Ahoj ' || i);
call dbms_sql.bind_variable(c, 'c', i + 0.033);
perform dbms_sql.execute(c);
end loop;
end;
$$;
select * from foo;
truncate foo;
do $$
declare c int;
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'insert into foo values(:a, :b, :c)');
for i in 1..100
loop
perform dbms_sql.bind_variable_f(c, 'a', i);
perform dbms_sql.bind_variable_f(c, 'b', 'Ahoj ' || i);
perform dbms_sql.bind_variable_f(c, 'c', i + 0.033);
perform dbms_sql.execute(c);
end loop;
end;
$$;
select * from foo;
truncate foo;
do $$
declare
c int;
a int[];
b varchar[];
ca numeric[];
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'insert into foo values(:a, :b, :c)');
a := ARRAY[1, 2, 3, 4, 5];
b := ARRAY['Ahoj', 'Nazdar', 'Bazar'];
ca := ARRAY[3.14, 2.22, 3.8, 4];
call dbms_sql.bind_array(c, 'a', a);
call dbms_sql.bind_array(c, 'b', b);
call dbms_sql.bind_array(c, 'c', ca);
raise notice 'inserted rows %d', dbms_sql.execute(c);
end;
$$;
select * from foo;
truncate foo;
-- should not to crash, when bound array is null
do $$
declare
c int;
ca numeric[];
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'insert into foo values(:a, 10, 20)');
call dbms_sql.bind_array(c, 'a', ca);
raise notice 'inserted rows %d', dbms_sql.execute(c);
end;
$$;
-- should not to crash, when we try to touch result without execute
do $$
declare
c int;
a int[];
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'select i from generate_series(1, 2) g(i)');
call dbms_sql.define_array(c, 1, a, 10, 1);
call dbms_sql.column_value(c, 1, a);
call dbms_sql.close_cursor(c);
end;
$$;
-- should not to crash, when the variable is overwritten
DO $$
declare
c integer;
n integer;
c2 numeric;
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'INSERT INTO foo(a) VALUES (:bnd2)');
call dbms_sql.bind_variable(c, 'bnd2', c2);
call dbms_sql.bind_variable(c, 'bnd2', c2);
n := dbms_sql.execute(c);
end
$$;
-- should not to crash, when we try to read column without data
do $$
declare
c int;
strval varchar;
intval int;
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'select ''foo'', 1');
call dbms_sql.define_column(c, 1, strval);
call dbms_sql.define_column(c, 2, intval);
perform dbms_sql.execute(c);
while dbms_sql.fetch_rows(c) > -1
loop
call dbms_sql.column_value(c, 1, strval);
end loop;
call dbms_sql.close_cursor(c);
end;
$$;
select * from foo;
truncate foo;
do $$
declare
c int;
a int[];
b varchar[];
ca numeric[];
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'insert into foo values(:a, :b, :c)');
a := ARRAY[1, 2, 3, 4, 5];
b := ARRAY['Ahoj', 'Nazdar', 'Bazar'];
ca := ARRAY[3.14, 2.22, 3.8, 4];
call dbms_sql.bind_array(c, 'a', a, 2, 3);
call dbms_sql.bind_array(c, 'b', b, 3, 4);
call dbms_sql.bind_array(c, 'c', ca);
raise notice 'inserted rows %d', dbms_sql.execute(c);
end;
$$;
select * from foo;
truncate foo;
do $$
declare
c int;
a int[];
b varchar[];
ca numeric[];
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'select i, ''Ahoj'' || i, i + 0.003 from generate_series(1, 35) g(i)');
call dbms_sql.define_array(c, 1, a, 10, 1);
call dbms_sql.define_array(c, 2, b, 10, 1);
call dbms_sql.define_array(c, 3, ca, 10, 1);
perform dbms_sql.execute(c);
while dbms_sql.fetch_rows(c) > 0
loop
call dbms_sql.column_value(c, 1, a);
call dbms_sql.column_value(c, 2, b);
call dbms_sql.column_value(c, 3, ca);
raise notice 'a = %', a;
raise notice 'b = %', b;
raise notice 'c = %', ca;
end loop;
call dbms_sql.close_cursor(c);
end;
$$;
drop table foo;
create table tab1(c1 integer, c2 numeric);
create or replace procedure single_Row_insert(c1 integer, c2 numeric)
as $$
declare
c integer;
n integer;
begin
c := dbms_sql.open_cursor();
call dbms_sql.parse(c, 'INSERT INTO tab1 VALUES (:bnd1, :bnd2)');
call dbms_sql.bind_variable(c, 'bnd1', c1);
call dbms_sql.bind_variable(c, 'bnd2', c2);
n := dbms_sql.execute(c);
call dbms_sql.debug_cursor(c);
call dbms_sql.close_cursor(c);
end
$$language plpgsql;
do $$
declare a numeric(7,2);
begin
call single_Row_insert(2,a);
end
$$;
select * from tab1;
do $$
declare a numeric(7,2) default 1.23;
begin
call single_Row_insert(2,a);
end
$$;
select * from tab1;
select * from tab1 where c2 is null;
do $$
declare a numeric(7,2);
begin
call single_Row_insert(0,a); -- single_Row_insert(0, null)
end
$$;
select * from tab1;
do $$
declare a numeric(7,2) default 1.23;
begin
call single_Row_insert(0,a); -- single_Row_insert(0, 1.23)
end
$$;
select * from tab1;
drop procedure single_Row_insert;
drop table tab1;