Open SQL Stored Procedure Examples
Example 9 – Executing a stored function using an RWDBOSql object (example 1)
This example shows how to invoke a stored function
EmpInDept, using an
RWDBOSql object, and fetch its result sets.
CREATE FUNCTION EmpInDept(INT) RETURNS SETOF REFCURSOR AS '
DECLARE employees REFCURSOR;
DECLARE salaries REFCURSOR;
BEGIN
OPEN employees FOR SELECT empno, ename FROM emp WHERE emp.dept = $1;
OPEN salaries FOR SELECT MIN(sal), AVG(sal), MAX(sal)
FROM emp WHERE emp.dept = $1;
RETURN NEXT employees;
RETURN NEXT salaries;
RETURN;
END; ' LANGUAGE 'plpgsql';
The stored function takes a department number as an input parameter. It produces two result sets: the first returns a list of employee numbers and names for each employee in that department; the second result set returns a single row with three columns containing the minimum, average and maximum salary of employees in that department.
RWDBOSql openSql ("SELECT * FROM EmpInDept($1);", RWDBOSql::Procedure); //1
RWDBTBuffer<int> dept; //2
openSql << dept; //3
dept[0] = 2; //4
cn.beginTransaction(); //5
openSql.execute(cn); //6
const size_t NUMBER_OF_ROWS = 10;
RWDBTBuffer<int> empNums (NUMBER_OF_ROWS);
RWDBTBuffer<RWCString> empNames (NUMBER_OF_ROWS); //7
openSql[0] >> empNums >> empNames; //8
long count = 0;
while ((count = openSql.fetch().rowsFetched()) > 0 ) { //9
for (int row = 0; row < count; row++) {
std::cout << "Employee: " << empNums[row] << ", "
<< empNames[row] << std::endl; //10
}
}
RWDBTBuffer<RWDecimalPortable> minBuff, avgBuff, maxBuff; //11
openSql[1] >> minBuff >> avgBuff >> maxBuff; //12
openSql.fetch(); //13
std::cout << "\nMinimum Salary: " << minBuff[0]
<< "\nAverage Salary: " << avgBuff[0]
<< "\nMaximum Salary: " << maxBuff[0]
<< std::endl; //14
cn.commitTransaction(); //15
Example 10 – Executing a stored function using an RWDBOSql object (example 2)
This example shows how to execute the stored function shown below that takes a varchar and an integer as arguments and returns a bool.
CREATE OR REPLACE FUNCTION add_employee(VARCHAR, INTEGER) RETURNS BOOL AS '
DECLARE
empname alias for $1;
payscale alias for $2;
foundname varchar;
BEGIN
select into foundname name from employee WHERE name = empname;
IF NOT FOUND THEN
insert into employee values(empname, payscale);
RETURN true;
END IF;
RETURN false;
END;
' LANGUAGE 'plpgsql';
To execute this procedure, we can use the PostgreSQL select statement:
select * from add_employee('new employee', 10);
Here's the code:
RWDBOSql osql("select * from add_employee($1, $2);",RWDBOSql::Procedure);
RWCString name('new employee');
RWDBTBuffer<RWCString> inputNameBuffer(&name, 1);
int inputInt = 10;
RWDBTBuffer<int> inputIntBuffer(&inputInt,1); //1
RWCString output;
RWDBTBuffer<RWCString> outputbuffer(&output, 1); //2
osql << inputIntBuffer << inputNameBuffer; //3
osql[0] >> outputbuffer; //4
osql.execute(cn); // Execute the stored function
long rows;
while ((rows=osql.fetch().rowsFetched())>0) { //5
cout << outputbuffer[0] << endl;
}