Il s'agit d'un exemple de code Java qui récupère et affiche les données source et de destination DBLINK dans Oracle Database à l'aide de DBLINK. Quand on m'a demandé "Y a-t-il une source (source d'information)?" Dans une certaine question dans un certain chat, c'est devenu "Gununu.", Alors je l'ai écrit. 彡 (゜) (゜)
J'ai essayé de vérifier avec la configuration suivante.
Java → (JDBC) → User_A → (DBLINK) → User_B
L'environnement utilise l'environnement suivant de Virtualbox. Il est facile à configurer car il est inclus depuis le début. 彡 (゜) (゜)
Créez sans effort un environnement Oracle DB 19c avec une image OTN VirtualBox https://qiita.com/ora_gonsuke777/items/b41f37637e59319796b4
Tout d'abord, créez User_A et insérez les données.
export ORACLE_HOME=/u01/app/oracle/product/version/db_1
export PATH=${PATH}:${ORACLE_HOME}/bin
sqlplus /nolog
CONNECT SYS/oracle@ORCL AS SYSDBA
CREATE USER USER_A IDENTIFIED BY USER_A
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;
GRANT CREATE SESSION TO USER_A;
GRANT CREATE TABLE TO USER_A;
ALTER USER USER_A QUOTA UNLIMITED ON USERS;
CONNECT USER_A/xxxxxxxx@orcl;
CREATE TABLE TBL_A(
COL1 NUMBER
);
INSERT INTO TBL_A VALUES(100);
COMMIT;
Connected.
User created.
Grant succeeded.
Grant succeeded.
User altered.
Connected.
Table created.
1 row created.
Commit complete.
Créez ensuite User_B et insérez les données. Que faire est avec User_A 彡 (゚) (゚)
export ORACLE_HOME=/u01/app/oracle/product/version/db_1
export PATH=${PATH}:${ORACLE_HOME}/bin
sqlplus /nolog
CONNECT SYS/oracle@ORCL AS SYSDBA
CREATE USER USER_B IDENTIFIED BY USER_B
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;
GRANT CREATE SESSION TO USER_B;
GRANT CREATE TABLE TO USER_B;
ALTER USER USER_B QUOTA UNLIMITED ON USERS;
CONNECT USER_B/xxxxxxxx@orcl;
CREATE TABLE TBL_B(
COL1 NUMBER
);
INSERT INTO TBL_B VALUES(200);
COMMIT;
Connected.
User created.
Grant succeeded.
Grant succeeded.
User altered.
Connected.
Table created.
1 row created.
Commit complete.
Créez DBLINK dans User_A et vérifiez l'opération. Vous pouvez voir que le TBL_B créé pour User_B ne peut être référencé que via DBLINK.
export ORACLE_HOME=/u01/app/oracle/product/version/db_1
export PATH=${PATH}:${ORACLE_HOME}/bin
sqlplus /nolog
CONNECT SYS/oracle@ORCL AS SYSDBA
GRANT CREATE DATABASE LINK TO USER_A;
CONNECT USER_A/xxxxxxxx@orcl;
CREATE DATABASE LINK DBL_USER_B
CONNECT TO USER_B IDENTIFIED BY xxxxxxxx
USING 'ORCL';
SELECT * FROM TBL_A;
SELECT * FROM TBL_B;
SELECT * FROM USER_B.TBL_B;
SELECT * FROM TBL_B@DBL_USER_B;
Connected.
Grant succeeded.
Connected.
Database link created.
COL1
----------
100
*
ERROR at line 1:
ORA-00942: table or view does not exist
*
ERROR at line 1:
ORA-00942: table or view does not exist
COL1
----------
200
Il s'agit d'un exemple qui se connecte à User_A et SELECT et affiche respectivement TBL_A et TBL_B (via DBLINK).
import java.sql.*;
public class GetDblinkData {
public static void main(String[] args) {
final String path = "jdbc:oracle:thin:@localhost:1521/orcl";
final String id = "USER_A"; //ID
final String pw = "xxxxxxxx"; //password
try (
Connection conn = DriverManager.getConnection(path, id, pw);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT COL1 FROM TBL_A");
Statement stmt2 = conn.createStatement();
ResultSet rs2 = stmt2.executeQuery("SELECT COL1 FROM TBL_B@DBL_USER_B");
) {
while (rs.next()) {
int i = rs.getInt("COL1");
System.out.println("TBL_A COL1 => " + i);
}
while (rs2.next()) {
int j = rs2.getInt("COL1");
System.out.println("TBL_B COL1 => " + j);
}
} catch(SQLException ex) {
ex.printStackTrace(); //Error
}
}
}
Enfin, compilez et exécutez. Lorsque vous exécutez la commande suivante ... 彡 (゚) (゚)
javac GetDblinkData.java
java -classpath /u01/app/oracle/product/version/db_1/jdbc/lib/ojdbc8.jar:. GetDblinkData
TBL_A COL1 => 100
TBL_B COL1 => 200
Les données d'origine DBLINK (TBL_A) et les données de destination DBLINK (TBL_B) peuvent être acquises et affichées! 彡 (^) (^)
J'ai pu confirmer que les données de la source DBLINK et de la destination DBLINK peuvent être acquises avec une seule connexion DB. Cependant, DBLINK est une épée à double tranchant. C'est un mécanisme étroitement couplé, alors n'en abusez pas. 彡 (゜) (゜)
Recommended Posts