ORACLE dblink+自定义function小练手

    --DBLINK

     当用户要跨本地数据库去访问另一个数据库的数据时,本地数据库就必须创建了远程数据库的dblink,通过dblink可以像访问本地数据库一样访问远程数据库表中的数据,创建dblink的时候需要知道待读取数据库的地址,端口,实例名,用户名和密码。

语法如下:

create public link linkTest connect to username identified by password using '**.**.**.**:端口号/实例名';

  在创建dblink之前,普通用户必须具有建立dblink的权限,查询权限语句如下:

select * from user_sys_privs a where a.privilege like '%LINK%';

如果不存在建立dblink权限的话, 则需要使用sys账户进行赋权,可以参考如下语句

grant create public database link,drop public database link to username

-- 查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名@dblink服务器”而已。  
select xxx FROM 表名@数据库链接名;

--自定义function

语法如下:

create [or replace] function 函数名称(参数名称 参数类型,...)

return 结果变量数据类型

as/is

  函数变量声明部分

begin

  逻辑部分

return 结果变量

[exception

  异常处理部分]

end[可带函数名称];

此次自定义函数练手,写了在函数内部执行动态sql和写逻辑语句(case...when...)两个,代码如下

--使用动态sql的写法
--入参不能声明长度
create or replace function hyfTest
(contract_type varchar2)
return varchar2
as 
  --临时变量必须声明长度
  v_sqlstr varchar2(2000);
  v_contract_type varchar(4);
  futucode_type nvarchar2(10);
begin
  v_contract_type := contract_type;
  --注意单引号转义
  v_sqlstr := 'select contract_model_code from username.contractmodel@linkTest where contract_type = '''||v_contract_type||'''';
  execute immediate v_sqlstr into futucode_type;
  return futucode_type;
exception
  when others
  then
  return 'sql执行错误'||v_sqlstr;
end hyfTest;  


--使用case语句的写法
create or replace function hyfTestCase
(contract_type varchar2)
return varchar2
as
  futucode_type varchar(4);
begin
  case contract_type
    when '-' then
      futucode_type := 'TT';
    when 'e' then
      futucode_type := 'SR';
    else
      futucode_type := ' ';
  end case;
    return (futucode_type);
end hyfTestCase;  

总结下来

1、建立dblink还可以在plsql上通过图形化界面建立

2、自定义函数语法很重要,比如入参,变量的数据长度定义问题,动态sql语句中的单引号转义

 

 

你可能感兴趣的:(oracle)