Search code examples
oracleodbcsqlplusaccess-violation

Why can I call DVF.F$LANGUAGE() with sqlplus but not with odbc? (ORACLE 19c)


I am running 2 Virtual Machines (VirtualBox 6.0):

  1. The database server: ORACLE Linux 8 with ORACLE 19c (64bit)
  2. The ODBC client: openSUSE 15.2 Linux, KDE, libsqora.so.21.1 and g++ (64bit)

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()}

Solution

  • 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(?, ?)}