U0100058: 目标数据库不支持dbms_sql.execute_and_fetch exact parameter value is true
描述
GaussDB不支持dbms_sql.execute_and_fetch。
数据库类型与版本
- 源库类型与版本:UGO 支持的 Oracle 版本。
- 目标库类型与版本:UGO 支持的 GaussDB 版本。
语法示例
DECLARE
l_cursor_id INTEGER;
l_rows_fetched INTEGER;
l_empno NUMBER;
l_ename VARCHAR2(50);
l_salary NUMBER;
BEGIN
l_cursor_id := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(
c => l_cursor_id,
statement => 'SELECT empno, ename, sal FROM emp WHERE empno = :emp_id',
language_flag => DBMS_SQL.NATIVE
);
DBMS_SQL.BIND_VARIABLE(l_cursor_id, ':emp_id', 7369);
DBMS_SQL.DEFINE_COLUMN(l_cursor_id, 1, l_empno);
DBMS_SQL.DEFINE_COLUMN(l_cursor_id, 2, l_ename, 50);
DBMS_SQL.DEFINE_COLUMN(l_cursor_id, 3, l_salary);
l_rows_fetched := DBMS_SQL.EXECUTE_AND_FETCH(l_cursor_id, TRUE);
IF l_rows_fetched > 0 THEN
DBMS_SQL.COLUMN_VALUE(l_cursor_id, 1, l_empno);
DBMS_SQL.COLUMN_VALUE(l_cursor_id, 2, l_ename);
DBMS_SQL.COLUMN_VALUE(l_cursor_id, 3, l_salary);
END IF;
DBMS_SQL.CLOSE_CURSOR(l_cursor_id);
EXCEPTION
WHEN OTHERS THEN
IF DBMS_SQL.IS_OPEN(l_cursor_id) THEN
DBMS_SQL.CLOSE_CURSOR(l_cursor_id);
END IF;
RAISE;
END;
/
改造建议
dbms_sql.execute_and_fetch替换为DBE_SQL.NEXT_ROW,并且注释掉第二个参数。
GaussDB修改后:
DECLARE
l_cursor_id NUMBER(38);
l_rows_fetched NUMBER(38);
l_empno NUMBER;
l_ename VARCHAR2(50);
l_salary NUMBER;
BEGIN
l_cursor_id := DBE_SQL.REGISTER_CONTEXT();
DBE_SQL.SQL_SET_SQL(
CONTEXT_ID => l_cursor_id,
QUERY_STRING => 'SELECT empno, ename, sal FROM emp WHERE empno = :emp_id',
language_flag => 2
);
DBE_SQL.SQL_BIND_VARIABLE(l_cursor_id, ':emp_id', 7369);
DBE_SQL.SET_RESULT_TYPE(l_cursor_id, 1, l_empno);
DBE_SQL.SET_RESULT_TYPE(l_cursor_id, 2, l_ename, 50);
DBE_SQL.SET_RESULT_TYPE(l_cursor_id, 3, l_salary);
DBE_SQL.SQL_RUN(l_cursor_id);
l_rows_fetched := DBE_SQL.NEXT_ROW(l_cursor_id/*, TRUE*/);
IF l_rows_fetched > 0 THEN
DBE_SQL.GET_RESULTS(l_cursor_id, 1, l_empno);
DBE_SQL.GET_RESULTS(l_cursor_id, 2, l_ename);
DBE_SQL.GET_RESULTS(l_cursor_id, 3, l_salary);
END IF;
DBE_SQL.SQL_UNREGISTER_CONTEXT(l_cursor_id);
EXCEPTION
WHEN OTHERS THEN
IF DBE_SQL.IS_ACTIVE(l_cursor_id) THEN
DBE_SQL.SQL_UNREGISTER_CONTEXT(l_cursor_id);
END IF;
RAISE;
END;
/