I am running 2 Virtual Machines (VirtualBox 6.0):
I can call 'DVF.F$LANGUAGE()' from sqlplus (with user 'SYSTEM', on client, container ORCLPDB):
SET SERVEROUTPUT ON;
ALTER SESSION SET CONTAINER=ORCLPDB;
DECLARE
LANG VARCHAR2(128);
BEGIN
LANG := DVF.F$LANGUAGE();
dbms_output.put_line(LANG);
END;
/
EXIT;
Output:
SQL*Plus: Release 21.0.0.0.0 - Production on Wed Aug 18 14:24:47 2021
Version 21.1.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Wed Aug 18 2021 14:20:36 +02:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Session altered.
ENGLISH_UNITED KINGDOM.AL32UTF8
PL/SQL procedure successfully completed.
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
I cannot call DVF.F$LANGUAGE() via ODBC (with user 'SYSTEM', on client, container ORCLPDB):
{? = CALL DVF.F$LANGUAGE()}
Output:
[Oracle][ODBC]Syntax error or access violation.
It is no 'Syntax error'. I can do:
{? = CALL SYSTEM.XYZ()}
It is a 'Syntax error'!
The function DVF$LANGUAGE() does not like
{? = CALL DVF.F$LANGUAGE()}
{:1 = CALL DVF.F$LANGUAGE()}
{:0 = CALL DVF.F$LANGUAGE()}
CALL DVF.F$LANGUAGE() INTO ?;
but it likes
CALL DVF.F$LANGUAGE() INTO :1;
A function SYSTEM.ABC() likes
CALL SYSTEM.ABC() INTO :1;
{? = CALL SYSTEM.ABC()}
A function SYSTEM.XYZ(?, ?) does not like
CALL SYSTEM.XYZ(:2, :3) INTO :1;
CALL SYSTEM.XYZ(:1, :2) INTO :0;
CALL SYSTEM.XYZ INTO :1 USING :2, :3;
CALL SYSTEM.XYZ INTO :0 USING :1, :2;
but it likes
{? = CALL SYSTEM.XYZ(?, ?)}