PL/SQL、DBMS_SQL无法显示数据
PL/SQL, DBMS_SQL can not display data
我是 DBMS_SQL 的新人。我试图从光标中获取第一行,但没有显示任何内容。我做错了什么?这是一个代码:
CREATE OR REPLACE PROCEDURE TEST_SQL
IS
id_var NUMBER;
name_var VARCHAR2(30);
sal_var Number;
source_cursor INTEGER;
countp INTEGER;
BEGIN
source_cursor := dbms_sql.open_cursor;
DBMS_SQL.PARSE(source_cursor,
'SELECT employee_id, first_name, salary FROM employees where department_id = 50',
DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, sal_var);
countp := DBMS_SQL.EXECUTE(source_cursor);
DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 3, sal_var);
dbms_output.put_line('id_var: '||id_var ||', name_var: '||name_var ||', sal_var: '|| sal_var);
END;
/
输出为:
PROCEDURE TEST_SQL compiled
anonymous block completed
id_var: , name_var: , sal_var:
编辑:学校错误 - 忘记了 Fetch_rows -.-
一切正常!
你不是fetching任何数据;你需要做的:
DBMS_SQL.FETCH_ROWS(source_cursor);
所以这有效:
CREATE OR REPLACE PROCEDURE TEST_SQL
IS
id_var NUMBER;
name_var VARCHAR2(30);
sal_var Number;
source_cursor INTEGER;
countp INTEGER;
BEGIN
source_cursor := dbms_sql.open_cursor;
DBMS_SQL.PARSE(source_cursor,
'SELECT employee_id, first_name, salary FROM employees where department_id = 50',
DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, sal_var);
countp := DBMS_SQL.EXECUTE(source_cursor);
countp := DBMS_SQL.FETCH_ROWS(source_cursor);
DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 3, sal_var);
dbms_output.put_line('id_var: '||id_var ||', name_var: '||name_var ||', sal_var: '|| sal_var);
END;
/
set serveroutput on
exec test_sql;
PL/SQL procedure successfully completed.
id_var: 120, name_var: Matthew, sal_var: 8000
或者正如 Tony Andrews 指出的那样,将这两个步骤与 EXECUTE_AND_FETCH
结合起来。
当然,您可能希望在循环中进行提取,因为这只会提取并显示查询返回的第一行。
我是 DBMS_SQL 的新人。我试图从光标中获取第一行,但没有显示任何内容。我做错了什么?这是一个代码:
CREATE OR REPLACE PROCEDURE TEST_SQL
IS
id_var NUMBER;
name_var VARCHAR2(30);
sal_var Number;
source_cursor INTEGER;
countp INTEGER;
BEGIN
source_cursor := dbms_sql.open_cursor;
DBMS_SQL.PARSE(source_cursor,
'SELECT employee_id, first_name, salary FROM employees where department_id = 50',
DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, sal_var);
countp := DBMS_SQL.EXECUTE(source_cursor);
DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 3, sal_var);
dbms_output.put_line('id_var: '||id_var ||', name_var: '||name_var ||', sal_var: '|| sal_var);
END;
/
输出为:
PROCEDURE TEST_SQL compiled
anonymous block completed
id_var: , name_var: , sal_var:
编辑:学校错误 - 忘记了 Fetch_rows -.- 一切正常!
你不是fetching任何数据;你需要做的:
DBMS_SQL.FETCH_ROWS(source_cursor);
所以这有效:
CREATE OR REPLACE PROCEDURE TEST_SQL
IS
id_var NUMBER;
name_var VARCHAR2(30);
sal_var Number;
source_cursor INTEGER;
countp INTEGER;
BEGIN
source_cursor := dbms_sql.open_cursor;
DBMS_SQL.PARSE(source_cursor,
'SELECT employee_id, first_name, salary FROM employees where department_id = 50',
DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, sal_var);
countp := DBMS_SQL.EXECUTE(source_cursor);
countp := DBMS_SQL.FETCH_ROWS(source_cursor);
DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 3, sal_var);
dbms_output.put_line('id_var: '||id_var ||', name_var: '||name_var ||', sal_var: '|| sal_var);
END;
/
set serveroutput on
exec test_sql;
PL/SQL procedure successfully completed.
id_var: 120, name_var: Matthew, sal_var: 8000
或者正如 Tony Andrews 指出的那样,将这两个步骤与 EXECUTE_AND_FETCH
结合起来。
当然,您可能希望在循环中进行提取,因为这只会提取并显示查询返回的第一行。