我创建了一个getEmployee(id in varchar)在我的远程数据库中调用的oracle函数,我试图使用数据库链接从我的本地数据库调用它.
在getEmployee,我正在尝试返回带有员工数据的游标.(表:员工(ID,名称,地址)):
SELECT schema.getEmployee@dblink(id)
FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
如何使用列名(ID,名称,地址)获取结果集?
根据Contrad,我改变了我的本地功能;
FUNCTION LocalGetEmployee(ID in varchar2)
RETURN Schema.SomeRefCursor
AS
OUTPUT Schema.SomeRefCursor;
BEGIN
OUTPUT := schema.getEmployee@dblink(ID);
RETURN OUTPUT;
END;
Run Code Online (Sandbox Code Playgroud)
但是,当我从Java代码调用此函数时,会引发以下错误:
"ORA-24338:语句句柄未执行"
我们公司有一个CRM系统,它使用Oracle 11g数据库.它由第三方供应商开发.
我们无权访问运行CRM系统的服务器.但是,我们有可用的DBA登录数据(SYS用户).它包括:
我们可以使用它来使用Oracle SQL Developer 3.1(连接>>属性)访问数据库
现在,部分数据必须从CRM数据库复制到另一个 Oracle数据库中,该数据库驻留在另一台服务器上.
据我了解,我需要在目标数据库中创建一个数据库链接.我试过这样的事情:
CREATE PUBLIC DATABASE LINK xxx CONNECT TO sys IDENTIFIED BY ***** USING 'MYTNSENTRY'
Run Code Online (Sandbox Code Playgroud)
我的tnsnames.ora如下:
MYTNSENTRY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.1.2.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = abc)
)
)
Run Code Online (Sandbox Code Playgroud)
....而我的listener.ora看起来像这样:
MYLISTENER=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=172.1.2.3)(PORT=1521))
))
SID_LIST_MYLISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=MYTNSENTRY)
(ORACLE_HOME=C:\somepath) # path to Oracle home …Run Code Online (Sandbox Code Playgroud) oracle database-connection database-link heterogeneous-services
我在Oracle SQL Developer中执行以下步骤(逐步使用F-9):
create database link mydb connect to my_schema identified by mypwd using 'connection1';
select * from users where id = 1;
rollback;
ALTER SESSION CLOSE DATABASE LINK mydb;
drop database link mydb;
Run Code Online (Sandbox Code Playgroud)
我尝试关闭数据库链接时收到错误:
SQL错误:ORA-02080:数据库链接正在使用02080. 00000 - "数据库链接正在使用中"
*原因:事务处于活动状态或者在alter session close database link命令中给出的数据库链接上打开了游标.
*动作:提交或回滚,并关闭所有游标
交易完成了,但是当我这样做时,select * from V$DBLINK;我看到还有一个打开的光标,但我不知道如何关闭那个.
sql oracle database-connection database-link database-cursor
是否可以在 oracle 中使用 DBLINK 调用函数?我正在调用这样的函数并收到错误 - ORA-00904: "MC"."GET_REFTYPES": invalid identifier
select column_value from table(mc.Get_REFTYPES@READ_MAIN_MCNAV(param1, param2, param3)));
Run Code Online (Sandbox Code Playgroud)
功能码
CREATE OR REPLACE FUNCTION "MC"."Get_REFTYPES"(
param1 IN VARCHAR,
param2 IN NUMBER,
param3 IN DATE DEFAULT SYSDATE
)
RETURN RefType_T PIPELINED IS
CURSOR cur_st (
cur_param1 VARCHAR,
cur_param2 NUMBER,
cur_param3 DATE
) IS
select
TypeID
FROM ......
WHERE......... ;
t_st Types_T; -- Table variable to store return values
BEGIN
OPEN cur_st(param1, param2 , param3 );
FETCH cur_st BULK COLLECT INTO t_st;
CLOSE cur_st;
FOR …Run Code Online (Sandbox Code Playgroud) 环境是Oracle 9和10.我没有DBA级别的访问权限.
问题是在另一个模式中验证特定表中是否存在特定列.
有两种情况需要处理.
鉴于我的模式FRED和另一个模式BARNEY,我试过这样的事情
SELECT 1
FROM BARNEY.USER_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE'
AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'
Run Code Online (Sandbox Code Playgroud)
产生了[1] :(错误):ORA-00942:表或视图不存在
在这一段时间过后,我意识到USER_TAB_COLS,实际上不是一个表.这是一种观点.我一直在从表中选择,但不是从视图中选择.
我用db_link尝试了同样的事情,并惊讶地看到数据回来了.db_link中有一个嵌入式schema_name /密码,所以我觉得它有用,因为它有效地登录到另一个模式,这应该使视图可以访问.
谷歌搜索了我的眼球,并在Oracle医生的山上磨了我的眼球,我正在寻找有人指出我正确的方向,或者至少指出我错过了什么.
有哪些技术可用于从同一实例中的模式获取与用户表相关的元数据,以验证特定列是否存在?
提前致谢.
邪恶.
+1为好的答案.谢谢.
我有一个SQL脚本使用"创建数据库链接"连接到另一个数据库,并复制一些数据.
在使用完毕后,是否应删除或关闭此数据库基本链接?(说,假设我可能不会再需要它).
什么是最佳做法?
我听到我的团队有一些相互矛盾的答案.
如果我要关闭它,我如何确保在我打电话时关闭链接:
drop database link somelink;
Run Code Online (Sandbox Code Playgroud)
(我得到错误抱怨我打开了连接,这很奇怪,因为我没有执行任何异步操作/作业).
我听说数据库链接不适合组织使用。为什么不利于安全?