postgresql之存储过程

这篇具有很好参考价值的文章主要介绍了postgresql之存储过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工作中可能会存在业务比较复杂,重复性工作比较多,需要批量处理数据的情况,此时使用存储过程会方便很多,存储过程的执行效率也会快很多,能帮助我们节省很多代码和时间。
并且,将需要的sql写成存储过程并设置成定时任务,那样在任意时刻,需要执行任意次数都可以根据你的设定执行,哪怕你不在工位上,减少你的工作量,能让你更愉快的摸鱼(不是)。

存储过程基本结构

定义一个函数
CREATE [ OR REPLACE ] FUNCTION
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
    [ RETURNS rettype
      | RETURNS TABLE ( column_name column_type [, ...] ) ]
  { LANGUAGE lang_name
    | TRANSFORM { FOR TYPE type_name } [, ... ]
    | WINDOW
    | IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | PARALLEL { UNSAFE | RESTRICTED | SAFE }
    | COST execution_cost
    | ROWS result_rows
    | SUPPORT support_function
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
  } ...

官方文档得到的定义一个函数的语法,当然现实中不需要所有的要素都要定义到。现在就常用的要素做出解释。

  • CREATE FUNCTION定义一个新函数。CREATE OR REPLACE FUNCTION将创建一个新函数或者替换一个现有的函数
  • name:表示要创建的函数名
  • argmode:
    一个参数的模式:IN、OUT、INOUT或者VARIADIC。如果省略,默认为IN。只有OUT参数能跟在一个VARIADIC参数后面。还有,OUT和INOUT参数不能和RETURNS TABLE符号一起使用。
  • argname:一个参数的名称
  • argtype:该函数参数的数据类型
  • default_expr:如果参数没有被指定值时要用作默认值的表达式
  • rettype:返回的数据类型,如果该函数不会返回一个值,可以指定返回类型为void。(后面详细讲)
  • column_name:RETURNS TABLE语法中一个输出列的名称
  • culumn_type:RETURNS TABLE语法中的输出列的数据类型

注意:定义函数的时候,参数可以是空,但是哪怕不修改函数体只修改参数,它会得到一个新的函数。

PL/pgSQL的结构
[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];

PL/pgSQL是一种块结构的语言。一个函数体的完整文本必须是一个块。存储过程的语法如上所示。
在一个块中的每一个声明和每一个语句都由一个分号终止。
所有的关键词都是大小写无关的。除非被双引号引用,标识符会被隐式地转换为小写形式,就像它们在普通 SQL 命令中。
PL/pgSQL代码中的注释和普通 SQL 中的一样。一个双连字符(–)开始一段注释,它延伸到该行的末尾。一个/* 开始一段块注释,它会延伸到匹配*/出现的位置。块注释可以嵌套。

赋值语法
声明变量赋值(具体可看官方文档)
name [ CONSTANT ] type [ COLLATE collation_name ] [ NOT NULL ] [ { DEFAULT | := | = } expression ];

在自定义函数中声明一个变量,并给这个变量赋值的时候可以用这个方法。示例如下:

-- 1
declare a integer default 32;
-- 2
declare a integer :=32;
-- 3
declare a integer;
a :=32;

这三种方法都能将声明一个变量a,并且将32赋值给a。若不给a赋值,就是方法三中没有a:=32;也不会报错,就是变量a初始化为sql空值。

  • constant:若是增加constant,则表示该变量的值无法修改
  • collate:给该变量指定一个排序规则
  • not null:如果给改变量赋值为空值会报错
    例如,以下方式就会报错。
-- 报错1
-- 加了constant,已经无法修改a的值了。
declare a constant integer default 32;
a :=1;

postgresql 存储过程,postgresql,数据库,sql

-- 报错2
-- 在声明变量的时候选择了not null,就应该在声明时赋值,否则哪怕后面赋值还是会报错
declare a integer not null;
a :=32;

postgresql 存储过程,postgresql,数据库,sql

动态赋值(具体可查看官方文档)

方式一:into子句

SELECT select_expressions INTO [STRICT] target FROM ...;
INSERT ... RETURNING expressions INTO [STRICT] target;
UPDATE ... RETURNING expressions INTO [STRICT] target;
DELETE ... RETURNING expressions INTO [STRICT] target;

举个例子,如下:

-- 这就表示把test表中的id字段的值赋值给a
-- 其中 select id from test就是基础sql命令从test表中查询id的值
-- 通过 into a 将查询得到的值赋值给a
select id into a from test;

方式二:动态命令

EXECUTE command-string [ INTO [STRICT] target ] [ USING expression [, ... ] ];

举个例子,如下:

-- 和上面一样,把id的值查询出来赋值给a
execute 'select id from test' into a;

返回值类型(官方文档)

postgresql 存储过程,postgresql,数据库,sql

returns返回类型可以是一种基本类型、组合类型或者域类型,也可以引用一个表列的类型。
当有OUT或者INOUT参数时,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致:如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。

返回void

如果该函数不会返回一个值,可以指定返回类型为void。
如果选择返回returns void,那函数体最后就不用return了。

CREATE OR REPLACE FUNCTION "public"."func1"()
 RETURNS "pg_catalog"."void" AS $BODY$    -- returns void,在保存的时候自动会变成"pg_catalog"."void"
   
   BEGIN
   -- 建表语句
   create table a(
   id int4,
   name varchar(50)
   );
   
END
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100

postgresql 存储过程,postgresql,数据库,sql

postgresql 存储过程,postgresql,数据库,sql

返回基本类型

返回的结果是类似int4,float,text等这些基本数据类型都可以。
示例:

CREATE OR REPLACE FUNCTION "public"."func1"()
 RETURNS "pg_catalog"."text" AS $BODY$
   
   declare val text;
   BEGIN
   insert into a values (1,'小明')  returning name into val;
   
   return val;
END
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100

postgresql 存储过程,postgresql,数据库,sql
这个函数的结果会返回val的值,如下图:
postgresql 存储过程,postgresql,数据库,sql
并且在表a中会插入一条数据,如下图。
postgresql 存储过程,postgresql,数据库,sql
这里敲黑板!!! 这里通过into子句赋值给变量,返回的是结果的第一行或者null(查询返回零行),除非使用order by进行排序,否则第一行是不明确的,第一行之后所有的结果都会被丢弃。
如果加了strict选项,那么查询结果必须是恰好一行,否则就会报错。
举个例子,现在在a表中插入数据,表a数据如下。
postgresql 存储过程,postgresql,数据库,sql
然后从表中查询出name值赋值val。

CREATE OR REPLACE FUNCTION "public"."func1"()
  RETURNS "pg_catalog"."text" AS $BODY$
	
	declare val text;
	
	BEGIN
	select name into val from a ;
	
	return val;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

得到的结果如下显示。返回一行数据,并且这个第一行的排序并不是表的第一行数据。
postgresql 存储过程,postgresql,数据库,sql
若是添加strict选项,结果返回的是多条数据就会报错,如下显示。
postgresql 存储过程,postgresql,数据库,sql
postgresql 存储过程,postgresql,数据库,sql
如果返回的结果刚好是一行数据的,则添加strict选项就可以显示最终结果。
postgresql 存储过程,postgresql,数据库,sql
正常显示结果并且返回。结果如下:
postgresql 存储过程,postgresql,数据库,sql

返回多条数据

到目前为止,现在返回的结果要不是返回空要不就是返回一个记录,若是想要多条数据该怎么处理呢?

  • 返回setof sometype
    SETOF修饰符表示该函数将返回一个项的集合而不是一个单一项。当被返回setof sometype时,函数最后一个查询执行完后输出的每一行都会被作为结果集的一个元素返回。
    sometype可以是某一张已经存在的表,也可以是record。也可以是某个字段类型。
    上面那个例子,若是想要返回多条记录,就可以修改如下。
CREATE OR REPLACE FUNCTION "public"."func1"()
  RETURNS SETOF "public"."a" AS $BODY$
	
	BEGIN

	return query select a.id,a.name from a limit 2;
	
	return;
END
$BODY$
  LANGUAGE plpgsql STABLE
  COST 100
  ROWS 1000

得到的结果如下图。
postgresql 存储过程,postgresql,数据库,sql
期中return query还可以使用return next。具体语法是:

RETURN NEXT expression;
RETURN QUERY query;
RETURN QUERY EXECUTE command-string [ USING expression [, ... ] ];

详细情况可以看查看官方文档。
使用方法可以参考(https://www.cnblogs.com/yanshw/p/12120473.html)
以及参考(https://my.oschina.net/Kenyon/blog/108303)

控制结构

postgresql中可以使用的控制结构,有条件结构和循环结构。

条件结构(官方文档)

IF语句:

  • IF … THEN … END IF
  • IF … THEN … ELSE … END IF
  • IF … THEN … ELSIF … THEN … ELSE … END IF
    具体语法官方文档链接中可查看,现在举个小例子看一个
CREATE OR REPLACE FUNCTION "public"."func1"("a" int4)
 RETURNS "pg_catalog"."text" AS $BODY$
   
   
   declare rel varchar;
   
   BEGIN

   		IF a>=90 THEN
   			rel:='优秀';
   		elsif a>=80 then
   		  rel := '良好';
   		elsif a>=60 then
   		  rel := '及格';
   		ELSE
   			rel :='不及格';
   		END IF;


   return rel;
END
$BODY$
 LANGUAGE plpgsql STABLE
 COST 100

postgresql 存储过程,postgresql,数据库,sql
postgresql 存储过程,postgresql,数据库,sql

CASE语句:

  • CASE … WHEN … THEN … ELSE … END CASE
  • CASE WHEN … THEN … ELSE … END CASE
    同理上面的函数可以改成case when
CREATE OR REPLACE FUNCTION "public"."func1"("a" int4)
  RETURNS "pg_catalog"."text" AS $BODY$
	
	
	declare rel varchar;
	
	BEGIN

		case when a>=90 THEN
					rel:='优秀';
				when a>=80 then
					rel := '良好';
				when a>=60 then
					rel := '及格';
				ELSE
					rel :='不及格';
		END case;


	return rel;
END
$BODY$
  LANGUAGE plpgsql STABLE
  COST 100
循环结构(官方文档)

循环结构有loop,exit,continue,while,for和foreach语句

  • loop
[ <<label>> ]
LOOP
   statements
END LOOP [ label ];

loop定义的是一个无条件循环,会无限重复直到被exit或return语句终止,所以

  • exit
EXIT [ label ] [ WHEN boolean-expression ];

指定when,当boolean-expression为真时会退出循环。配合loop给个例子。

	LOOP
		raise notice 'a is %',a;
		a :=a-1;

		IF a<=rel THEN
			EXIT; 
		END IF; 
	END LOOP;


-- 等同于
	LOOP
		raise notice 'a is %',a;
		a :=a-1;

		EXIT when a<=rel;      -- 这个相当于前面整个if判断
	END LOOP;

postgresql 存储过程,postgresql,数据库,sql
执行函数,传入参数为5,则显示的结果如下:
postgresql 存储过程,postgresql,数据库,sql

  • continue
CONTINUE [ label ] [ WHEN boolean-expression ];
  • while
[ <<label>> ]
WHILE boolean-expression LOOP
   statements
END LOOP [ label ];

当boolean-expression为真的时候,这个循环会执行。举例:

CREATE OR REPLACE FUNCTION "public"."loops"("a" int4)
  RETURNS "pg_catalog"."void" AS $BODY$
	
	declare rel integer default 0;
	
	BEGIN
	
	
	WHILE a>0 LOOP
		raise info 'a= %',a;
		rel := rel+a;
		a:=a-1;
	END LOOP;
	
	raise info 'rel = %',rel;

	
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

postgresql 存储过程,postgresql,数据库,sql
执行函数输入参数5,得到信息如下:
postgresql 存储过程,postgresql,数据库,sql

  • for
    整数范围循环。
[ <<label>> ]
FOR name IN [ REVERSE ] expression .. expression [ BY expression ] LOOP
    statements
END LOOP [ label ];

for循环会创建一个整数返回进行迭代。此时下界临界值小于上界临界值,若是制定reverse,则上界临界值写在前,下界临界值写在后,默认步长为1,若是正向迭代,每次迭代数值都是加1,若是反向迭代都是减1。通过by,可以指定步长。
例如:

FOR i IN 1..10 LOOP
   -- 我在循环中将取值 1,2,3,4,5,6,7,8,9,10 
END LOOP;

FOR i IN REVERSE 10..1 LOOP
   -- 我在循环中将取值 10,9,8,7,6,5,4,3,2,1 
END LOOP;

FOR i IN REVERSE 10..1 BY 2 LOOP
   -- 我在循环中将取值 10,8,6,4,2 
END LOOP;

查询结果循环

[ <<label>> ]
FOR target IN query LOOP
    statements
END LOOP [ label ];

target是一个记录变量、行变量或者逗号分隔的标量变量列表。target被连续不断被赋予来自query的每一行,并且循环体将为每一行执行一次。下面是一个例子:

CREATE OR REPLACE FUNCTION "public"."loops"()
  RETURNS "pg_catalog"."void" AS $BODY$
	
	declare rel record;
	
	BEGIN
	

	FOR rel IN select id,name from a LOOP
		-- quote_ident()的作用是为字符串加上双引号
		raise notice 'a表中的用户信息为id: %,name: %',rel.id,quote_ident(rel.name);
	
	END LOOP;

	
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

结果显示如下:
postgresql 存储过程,postgresql,数据库,sql
for-in-execute语句在行上迭代的另一种方式:

[ <<label>> ]
FOR target IN EXECUTE text_expression [ USING expression [, ... ] ] LOOP
    statements
END LOOP [ label ]

这个例子类似前面的形式,只不过源查询被指定为一个字符串表达式,在每次进入FOR循环时都会计算它并且重新规划。
在使用EXECUTE时,可以通过USING将参数值插入到动态命令中。

  • foreach
    FOREACH循环很像一个FOR循环,但不是通过一个 SQL 查询返回的行进行迭代,它通过一个数组值的元素来迭代。
[ <<label>> ]
FOREACH target [ SLICE number ] IN ARRAY expression LOOP
    statements
END LOOP [ label ];

具体例子不再给出,看看官方文档中的例子。

CREATE FUNCTION sum(int[]) RETURNS int8 AS $$
DECLARE
  s int8 := 0;
  x int;
BEGIN
  FOREACH x IN ARRAY $1
  LOOP
    s := s + x;
  END LOOP;
  RETURN s;
END;
$$ LANGUAGE plpgsql;

提示信息(官方文档)

使用raise语句报告消息以及抛出错误,上面给的示例中已经有部分给出,语法是

RAISE [ level ] 'format' [, expression [, ... ]] [ USING option = expression [, ... ] ];
RAISE [ level ] condition_name [ USING option = expression [, ... ] ];
RAISE [ level ] SQLSTATE 'sqlstate' [ USING option = expression [, ... ] ];
RAISE [ level ] USING option = expression [, ... ];
RAISE ;

level选项指定了错误的严重性。允许的级别有DEBUG、LOG、INFO、NOTICE, WARNING以及EXCEPTION,默认级别是EXCEPTION。
raise log ‘这是日志消息’; – 输出在日志文件中
raise inof ‘这是一个信息’; – 以下信息打印在控制台
raise notice ‘这个是提示消息’;
raise notice warning ‘这是个警告’;
raise exception ‘这个异常消息’;

调用存储过程

当存储过程编译出来后,我们该如何执行或者调用存储过程呢?语法如下。

select function_name();
select * from function_name();
select * from function_name where 筛选条件;    -- 当返回的结果为多条数据的结果集的时候
select * from function_name() as tablename(column name,column type[,...]) ;   --动态返回结果集

案例

以上就是存储过程的基本语法,接下来再给几个具体实例巩固一下。
案例一:无查询结果时,不用select,用perform。

CREATE OR REPLACE FUNCTION "public"."fun_etc"()
  RETURNS "pg_catalog"."void" AS $BODY$
	
	BEGIN
	perform current_date;

END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

postgresql 存储过程,postgresql,数据库,sql
案例二:for查询结果循环,声明语法拷贝类型(拷贝一个行变量)
拷贝行类型,语法声明:v_value table_name%ROWTYPE
若是拷贝一个已有的列数据类型,语法:v_value variable%TYPE,类似declare b a.name%TYPE

CREATE OR REPLACE FUNCTION "public"."fun_etc"()
  RETURNS "pg_catalog"."text" AS $BODY$
	
	declare b a%rowtype;  
	
	BEGIN
	for b in select id,name from a loop
		 raise info 'b的值=%',b;
		 
	 end loop;
	

return b.id||'---'||b.name;
	
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

postgresql 存储过程,postgresql,数据库,sql

信息结果:
postgresql 存储过程,postgresql,数据库,sql
return返回结果:return返回只会返回执行的最后一个结果。
postgresql 存储过程,postgresql,数据库,sql
案例三:当sql中的语句有变量的时候,可以用||拼接,最后execute执行。

CREATE OR REPLACE FUNCTION "public"."fun_etc"()
  RETURNS "pg_catalog"."void" AS $BODY$
	
	declare ifexists integer;
	declare sqltext text;  
	declare b record;
	
	BEGIN
	-- 判断表是否存在,存在值=1,不存在值=0
	sqltext:='
		select count(1)  from pg_class where relname=''a_'||to_char(CURRENT_DATE,'yyyy_mm_dd')||'''';
	execute sqltext into ifexists;
	
	
	-- 判断表是否存在,不存在则建表
	IF ifexists=0 then
	
		-- 建立一张新表
		sqltext:='
		
			create table "a_'||to_char(CURRENT_DATE,'yyyy_mm_dd')||'" 
			(
			create_time date,
			id int4,
			name varchar(50)
			);';
			
		execute sqltext;
	
	END IF;
	
	-- 从表a中查询数据插入这表中
	sqltext :='
	insert into a_'||to_char(CURRENT_DATE,'yyyy_mm_dd')||' 
	select CURRENT_DATE,id,name from a
	';
	
	execute sqltext;

	

	-- 查询显示数据
	sqltext:= 'select create_time,id,name from a_'||to_char(CURRENT_DATE,'yyyy_mm_dd')||';';
	for b in execute sqltext loop
		raise info '%',b;
		
	end loop;
	

	
	return ;
	
	
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

postgresql 存储过程,postgresql,数据库,sql

postgresql 存储过程,postgresql,数据库,sql
postgresql 存储过程,postgresql,数据库,sql
案例四:为了使函数更加通用,以解决动态返回数据集的问题,将表名作为参数传进去。

CREATE OR REPLACE FUNCTION "public"."fun_etc"("name" varchar)
  RETURNS SETOF "pg_catalog"."record" AS $BODY$
	
	declare b record;
	
	BEGIN
	
		for b in execute 'select * from '||name loop
	
	 	return next b;
	end loop;
	
	return ;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000
select * from fun_etc('a') as a(id int,name varchar(50));

结果显示:
postgresql 存储过程,postgresql,数据库,sql

select * from fun_etc('a_2022_12_21') as a(create_time date,id int,name varchar(50));

结果显示:
postgresql 存储过程,postgresql,数据库,sql
其他需要注意的是,我这边都是在一个函数上修改,若是参数都一样的话,他是会在原函数上修改的,所以你们别这样啊,否则都白写了。
好了,本文到这里就结束了。
感觉您的阅读~文章来源地址https://www.toymoban.com/news/detail-681114.html

到了这里,关于postgresql之存储过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MySQL】探索MySQL存储过程的魔力,初学者的数据库编程秘笈(内含实战SQL脚本)

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:重温MySQL MySQL存储过程作为一种服务器端的 数据库编程方式 ,提供了高效、可重用的方法来执行相对复杂的数据库操

    2024年02月15日
    浏览(48)
  • postgresql 使用之 存储架构 触摸真实数据的存储结构以及组织形式,存入数据库的数据原来在这里

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 个人主页 :我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. postgresql 数据库服务运行时,数据在磁盘上是如何存储的呢?这就涉及到了存储架构。 在文件系统中,我们可以看到以目录和文

    2024年02月14日
    浏览(31)
  • postgresql|数据库|SQL语句冲突的解决

    postgresql数据库是比较复杂的一个关系型数据库,而有些时候,即使是简单的插入更新操作也是有很多复杂的机制。 那么,什么是冲突?什么时候会遇到冲突(也就是冲突的常见场景)?如果有冲突我们应该怎么去解决?这些问题我想应该是在此文章中详细说明的。 复杂点的

    2024年02月06日
    浏览(56)
  • 数据库: 存储过程

    sql server begin end用法: SQL Server中的BEGIN END用法是用于定义一个代码块,这个代码块可以包含多个SQL语句,BEGIN END通常用于控制流程语句,例如IF语句、WHILE语句、TRY CATCH语句等。在BEGIN END代码块中,可以使用变量、函数、存储过程等SQL Server的元素。BEGINEND的语法如下: BEGIN SQL语

    2024年02月09日
    浏览(31)
  • [运维|数据库] PostgreSQL数据库对MySQL的 READS SQL DATA 修饰符处理

    在 PostgreSQL 中,访问权限通常是通过数据库角色和表级别的权限进行管理,而不需要类似 MySQL 中的 READS SQL DATA 修饰符。 要在 PostgreSQL 中管理数据库对象的访问权限,您可以使用以下 SQL 命令: GRANT :授予用户或角色对表、视图等对象的特定权限。 REVOKE :撤销用户或角色对

    2024年02月07日
    浏览(58)
  • 【MySQL 数据库】9、存储过程

    🌱 存储过程是事先经过编译并存储在数据库中的 SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,可以提高数据处理效率 🌱 存储过程思想上很简单:就是数据库 SQL 语言层面的代码封装与重用 🍃 【封装,复用

    2024年02月08日
    浏览(34)
  • 数据库(MySQL)的存储过程

    存储过程是事先经过编译并存储在数据库中的一段SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想上很简单,就是数据库SQL 语言层面的代码封装与重用。 特点

    2024年02月10日
    浏览(33)
  • Oracle数据库创建存储过程

    下面是一个迁移数据库数据的存储过程: 存储过程中用到的 while 循环逻辑:  

    2024年02月11日
    浏览(33)
  • 数据库实验6 存储过程实验

    前言:游标的mysql代码不懂写,所以没有运行结果 实验6.1 存储过程实验 1.实验目的 掌握数据库 PL/SQL 编程语言,以及数据库存储过程的设计和使用方法。 2.实验内容和要求 存储过程定义,存储过程运行,存储过程更名,存储过程删除,存储过程的参数传递。掌握PL/SQL编程语言和编

    2024年02月04日
    浏览(40)
  • postgresql|数据库|批量执行SQL脚本文件的shell脚本

    对于数据库的维护而言,肯定是有SQL脚本的执行,例如,某个项目需要更新,那么,可能会有很多的SQL脚本需要执行,SQL脚本可能会包含有建表,插入数据,索引建立,约束建立,主外键建立等等内容。 那么,几个SQL脚本可能无所谓,navicat或者psql命令行 简简单单的就导入了

    2024年02月01日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包