Аргументы, которые вы передаете, являются строками, и вы объединяете их в свой динамический c запрос; но без кавычек, поэтому внутренний запрос заканчивается как:
SELECT * INTO rowss from SAL where SNAME=Peel and CITY=London;
Вы можете добавить кавычки вокруг этих значений (но они должны быть экранированы):
EXECUTE IMMEDIATE
'DECLARE rowss SAL%ROWTYPE;
BEGIN SELECT * INTO rowss from SAL where SNAME=''' || where_in_sname ||
''' and CITY='''|| where_in_city ||''';
END;';
, что вместо generate:
SELECT * INTO rowss from SAL where SNAME='Peel' and CITY='London';
Но гораздо лучше использовать переменные связывания:
EXECUTE IMMEDIATE
'DECLARE rowss SAL%ROWTYPE;
BEGIN SELECT * INTO rowss from SAL where SNAME=:where_in_sname' ||
' and CITY=:where_in_city' USING where_in_sname, where_in_city;
END;';
Переменная rowss
существует только в пределах этого динамического оператора c, хотя процедура и ее вызывающая сторона не вижу результатов.
Во всяком случае, это не обязательно по Dynami c; Вы можете просто сделать:
CREATE OR REPLACE PROCEDURE instead_of_select(
where_in_sname IN VARCHAR2,
where_in_city IN VARCHAR2)
IS
rowss SAL%ROWTYPE;
BEGIN
SELECT * INTO rowss
from SAL
where SNAME=where_in_sname
and CITY= where_in_city;
END instead_of_select;
Но звонящий по-прежнему не видит rowss
. Непонятно, что вы ожидаете или хотите получить от результатов - возможно, вы хотите передать их обратно как переменную OUT, как запись или, возможно, как курсор ref. (Предположительно, фильтр делает результат уникальным, в противном случае вы получите ошибку «слишком много строк»; вы все равно можете получить «no-data-found»).