Skip to Main Content
  • Home
  • APEX
  • APEX 19c/20c Export Workspace ORA-01775

Breadcrumb

APEX 19c/20c Export Workspace ORA-01775

Problembeschreibung

Beim Versuch, wie gewohnt via scripting APEX Workspaces als Ganzes logisch zu exportieren (wg. Migration Apex 4.2.6. => Apex 19) kommt es sowohl mit dem 19c APEX als auch dem frisch heruntergeladenen und installieren APEX 20.1 zu folgendem Fehler:

APEX_BASE=$ORACLE_HOME/apex      <= Location vom original 19c APEX (oder auch vom frisch heruntergeladenen APEX 20.1)
export CLASSPATH=$APEX_BASE/utilities:$ORACLE_HOME/oui/jlib/classes12.jar:$APEX_BASE/utilities/oracle/apex
PATH=$ORACLE_HOME/jdk/bin/:/usr/bin:/etc:/usr/sbin:/usr/ucb:/home/oracle/bin:/usr/bin/X11:/sbin:.:$ORCLE_HOME/bin
export NLS_LANG=american_america.AL32UTF8

export LOGIN="  -db 10.12.10.12:1521:iris -user system -password ....."
java  oracle.apex.APEXExport $LOGIN -expWorkspace
Exporting Workspace 4525525336221922:'IRIS'
Exception in thread "main" java.sql.SQLException: ORA-01775: Zyklische Kette von Synonymen
ORA-06512: in "SYS.DBMS_PICKLER", Zeile 18
ORA-06512: in "SYS.DBMS_PICKLER", Zeile 58
ORA-06512: in Zeile 1

    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:189)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:242)
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:554)
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1478)
    at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:888)
    at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2076)
    at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1986)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2697)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:457)
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:531)
    at oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:493)
    at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:406)
    at oracle.sql.ArrayDescriptor.initPickler(ArrayDescriptor.java:1023)
    at oracle.sql.ArrayDescriptor.(ArrayDescriptor.java:137)
    at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:102)
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:190)
    at oracle.apex.APEXExport.get_export_stmt(APEXExport.java:137)
    at oracle.apex.APEXExport.ExportWorkspace(APEXExport.java:556)
    at oracle.apex.APEXExport.ExportWorkspaces(APEXExport.java:437)
    at oracle.apex.APEXExport.main(APEXExport.java:895)

Analyse und Workaround

Die Fehlermeldung ORA-01775: Zyklische Kette von Synonymen ist grundsätzlich falsch. In der Quelldatenbank gibt es keine zyklischen Synonyme. Der Fehler liegt im APEX 19c und auch dem APEX 20.1 Java program  oracle.apex.APEXExport! Nicht gerade intuitiv, weil in der Fehlermeldung als Ort SYS.DBMS_PICKLER angegeben wird.

Nimmt man den "golden APEX Release 4.2.6" sieht das wie gewohnt so aus:

APEX_BASE=$ORACLE_HOME/apex_full_426  
export CLASSPATH=$APEX_BASE/utilities:$ORACLE_HOME/oui/jlib/classes12.jar:$APEX_BASE/utilities/oracle/apex
PATH=$ORACLE_HOME/jdk/bin/:/usr/bin:/etc:/usr/sbin:/usr/ucb:/home/oracle/bin:/usr/bin/X11:/sbin:.:$ORCLE_HOME/bin
export NLS_LANG=american_america.AL32UTF8

export LOGIN="  -db 10.12.10.12:1521:iris -user system -password .... "
java  oracle.apex.APEXExport $LOGIN -expWorkspace
Exporting Workspace 4525525336221922:'IRIS'
 Completed at Thu Oct 22 10:19:52 CEST 2020
Exporting Workspace 5763317710207076:'IRS_ACC'
 Completed at Thu Oct 22 10:19:52 CEST 2020
Exporting Workspace 10214923182996608:'IRS_AUX'
 Completed at Thu Oct 22 10:19:52 CEST 2020
Exporting Workspace 72989428585435775:'IRIS_CUST'
 Completed at Thu Oct 22 10:19:52 CEST 2020

Beispiel Script zum Export aller Workspaces

User Beispiel für ein "Dump alle workspaces, workspace-files und workspace-applications " script sieht wie folgt aus:

#!/bin/bash
#
# Export all APEX workspaces, Workspace-files and Applications
# will create for each exported workspace one file  w.sql  and one  sudirectory
# (c)2019 Peter Renner
#
# parameter 1    hostname:port:sid
# parameter 2    password-of-user-system
#

APEX_BASE=$ORACLE_HOME/apex            # broken
APEX_BASE=$ORACLE_HOME/apex_full_426   # APEX 4.2.6  needs to be downloaded first!

export CLASSPATH=$APEX_BASE/utilities:$ORACLE_HOME/oui/jlib/classes12.jar:$APEX_BASE/utilities/oracle/apex
PATH=$ORACLE_HOME/jdk/bin/:/usr/bin:/etc:/usr/sbin:/usr/ucb:/home/oracle/bin:/usr/bin/X11:/sbin:.:$ORCLE_HOME/bin

export NLS_LANG=american_america.AL32UTF8
export LOGIN="  -db $1  -user system   -password $2 "

echo ====================== expWorkspace   export all Workspaces

HERE=`pwd`
rm -f exp_ws_list.txt
java  oracle.apex.APEXExport $LOGIN -expWorkspace | tee  exp_ws_list.txt

#   $3   format is  workspaceid:'workspacename'
grep Workspace exp_ws_list.txt | awk ' {print $3}' | sed -e "s/'/:/g" | awk -F: ' { print $1 " " $3 } '  | while read id name
do
       echo "============== export Workspace id $id name $name ============"
       mkdir -p $HERE/$name
       cd       $HERE/$name
       rm -f    $HREE/$name/*.sql
       java  oracle.apex.APEXExport $LOGIN -workspaceid $id
       java  oracle.apex.APEXExport $LOGIN -workspaceid $id  -expFiles
done