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