‘壹’ postgresql存储过程怎么写
写个触发器 插入之前执行触发器
-- 创建一个测试表
create table test(id int primary key , name varchar(50));
-- 触发器 插入前ID如果已经存在则替换name的值
CREATE OR REPLACE function _replace() RETURNS TRIGGER AS $INSERT$
declare
_has int ;
BEGIN
select id from test where id = NEW.id into _has;
raise notice 'ddd:%' , _has;
if _has > 0 then
update test set name = NEW.name where id = NEW.id;
RETURN null;
end if;
return NEW;
END;
$INSERT$
LANGUAGE PLPGSQL;
-- 给表加上触发器
CREATE TRIGGER tbefore BEFORE INSERT ON test FOR EACH ROW EXECUTE PROCEDURE _replace();
-- 插入两个值
insert into test(id , name) values(1,'1');
insert into test(id , name) values(1,'6');
select * from test;
结果:
pumpkin=> select * from test;
id | name
----+------
1 | 6
(1 行记录)
时间:1.474 ms
‘贰’ plsql存储过程,执行失败,但是重新编译就能执行成功,什么原因
可能你修改了与该存储过程相关的数据表之类的对象,修改了之后,就会导致对应存储过程失效
‘叁’ 为什么我的存储过程总要重新编译
这是我同事做的一个存储过程,我们一般都用这个处理
CREATE OR REPLACE PROCEDURE OWN.P_HSJ_COMPRE
IS
CURSOR cur_invalid_obj IS
SELECT uo.object_name,uo.object_type
FROM user_objects uo,
USER_ORDER_OBJECT_BY_DEPEND uobd
WHERE uo.object_id = uobd.object_id(+) AND uo.status != 'VALID'
ORDER BY uobd.dlevel desc,uo.object_type,uo.object_name;
ls_objname VARCHAR2(100);
ls_objtype VARCHAR2(100);
ls_status VARCHAR2(20);
ls_text VARCHAR2(4000);
ls_sql varchar2(100);
BEGIN
OPEN cur_invalid_obj;
LOOP
FETCH cur_invalid_obj INTO ls_objname,ls_objtype;
EXIT WHEN cur_invalid_obj%NOTFOUND;
IF ls_objtype IN ('PACKAGE BODY', 'PACKAGE', 'FUNCTION', 'PROCEDURE','TRIGGER', 'VIEW') THEN
if ls_objtype ='VIEW' then
ls_sql :=' ALTER VIEW '||LS_OBJNAME ||' COMPILE';
execute immediate ls_sql;
else
DBMS_DDL.alter_compile(ls_objtype,NULL,ls_objname);
end if;
SELECT status INTO ls_status FROM user_objects
WHERE object_name = ls_objname AND object_type = ls_objtype;
/* IF ls_status != 'VALID' THEN
SELECT text INTO ls_text FROM user_errors
WHERE name = ls_objname AND type = ls_objtype;
END IF;
*/
END IF;
END LOOP;
CLOSE cur_invalid_obj;
EXCEPTION
WHEN OTHERS THEN
IF cur_invalid_obj%ISOPEN THEN
CLOSE cur_invalid_obj;
END IF;
END;
/
‘肆’ postgresql存储过程怎么用
PostgreSQL有pldbgapi扩展,先安装此扩展。
首先,需要将debug的模组载入到PostgreSQL服务器中去。做法是: 在pgAdminIII中以管理员登录,然后选择菜单“工具->服务器配置->postgresql.conf”,
在配置窗口中,双击项目"shared_preload_libraries",
在其设定窗口中,将值设置成plugin_debugger的路径(Windows 9.3版本的为$libdir/plugin_debugger.dll, $libdir一般为PostgreSQL安装目录下的lib文件夹)。非Windows系统的后缀名会有所不同,可能为plugin_debugger.so。
注意,在做这一步时最好先备份配置文件,以防指定文件找不到而导致服务器不能启动。
在设定完成之后,重新启动PostgreSQL服务(以启动debug插件)。
然后在pgAdminIII中扩展安装时选择如下图项目,
这样在函数的右键菜单中就有调试选项了,
当然,最常用的调试方式就是自己直接调用函数来查看执行结果是否正确。
‘伍’ postgresql 怎样对存储过程进行调试
PostgreSQL有pldbgapi扩展,先安装此扩展。
首先,需要将debug的模组载入到PostgreSQL服务器中去。做法是: 在pgAdminIII中以管理员登录,然后选择菜单“工具->服务器配置->postgresql.conf”,
当然,最常用的调试方式就是自己直接调用函数来查看执行结果是否正确。
‘陆’ plsql编译存储过程
如果是在plsql
developer中修改的,可以直接点那个齿轮图标,或者F8即可编译。
如果是在sqlplus中,那就敲入修改后的过程代码(create
or
replace
procere...),最后以/结尾运行即可。
‘柒’ 哪些情况需要重新编译存储过程
如果是在plsql developer中修改的,可以直接点那个齿轮图标,或者F8即可编译。 如果是在sqlplus中,那就敲入修改后的过程代码(create or replace procere...),最后以/结尾运行即可。
‘捌’ PLSQL修改了存储过程如何编译保存
如果是在plsql developer中修改的,可以直接点那个齿轮图标,或者F8即可编译。
如果是在sqlplus中,那就敲入修改后的过程代码(create or replace procere...),最后以/结尾运行即可。
‘玖’ pgadmin4 编译存储过程
我知道利用c++语句编译储存
1)更改数据库目录下的postgresql.conf,加入如下红色语句:
#shared_preload_libraries = '' # (change requires restart)(这个系统默认下是注释掉的,在这句下面加入下面语句)
shared_preload_libraries = '$libdir/plugins/plugin_debugger'(这是新加入的)
2)重新启动pg服务
3)在要进行调试的数据库里执行pldbgapi.sql文件,这个文件在你pg安装目录的share/postgresql/contrib/下面
调试pg的function
1)打开pgadmin4,打开你要调试的数据库,在你要调试的function上右击,这时你会发现多了一项Debugging,占击子项中的debug就可对function进行调试了。