GBase 8s
适配迁移
问答
如何实现表值函数(函数返回table)
发表于2025-03-04 13:12:0087次浏览4个评论
为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【GBase版本】:GBase8sV8.8_TL_3.5.1_3X2_x86_64
【操作系统】:centos7
【CPU】:虚拟机
【问题描述】*:
Gbase中如何实现表值函数的功能,如下文(SQL-server表值函数)。相关的语法说明?
CREATE FUNCTION [dbo].[Fun_TakeApartVarchar](@SourceSql varchar(8000),@StrSeprate varchar(10))
RETURNS @temp TABLE(ID int,Value varchar(100))
--实现将字符串通过指定字符进行拆分功能的函数
-- Date:2020-02-05
AS
BEGIN
DECLARE @i int,@j int
SET @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
SET @j=1
WHILE @i>=1
BEGIN
INSERT @temp VALUES(@j,LEFT(@SourceSql,@i-1))
SET @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
SET @i=charindex(@StrSeprate,@SourceSql)
SET @j=@j+1
END
IF @SourceSql<>''
INSERT @temp VALUES(@j,@SourceSql)
RETURN
END评论
登录后才可以发表评论
路路路发表于 1年前
稍等,我们马上查看
GBase用户12345发表于 1年前
和oracle类似,例如:
set environment sqlmode 'oracle';
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
first_name VARCHAR2(50) NOT NULL,
last_name VARCHAR2(50) NOT NULL,
email VARCHAR2(50) UNIQUE NOT NULL,
hire_date DATE NOT NULL
);
CREATE OR REPLACE TYPE employee_obj AS OBJECT (
employee_id NUMBER,
first_name VARCHAR2(50),
last_name VARCHAR2(50)
);
CREATE OR REPLACE TYPE employee_tab AS TABLE OF employee_obj;
CREATE OR REPLACE FUNCTION get_employees(dept_id IN NUMBER)
RETURN employee_tab PIPELINED IS
BEGIN
FOR emp IN (SELECT employee_id, first_name, last_name FROM employees WHERE department_id = dept_id) LOOP
PIPE ROW (employee_obj(emp.employee_id, emp.first_name, emp.last_name));
END LOOP;
RETURN;
END;
/
SELECT * FROM TABLE(get_employees(101));
set environment sqlmode 'oracle';
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
first_name VARCHAR2(50) NOT NULL,
last_name VARCHAR2(50) NOT NULL,
email VARCHAR2(50) UNIQUE NOT NULL,
hire_date DATE NOT NULL
);
CREATE OR REPLACE TYPE employee_obj AS OBJECT (
employee_id NUMBER,
first_name VARCHAR2(50),
last_name VARCHAR2(50)
);
CREATE OR REPLACE TYPE employee_tab AS TABLE OF employee_obj;
CREATE OR REPLACE FUNCTION get_employees(dept_id IN NUMBER)
RETURN employee_tab PIPELINED IS
BEGIN
FOR emp IN (SELECT employee_id, first_name, last_name FROM employees WHERE department_id = dept_id) LOOP
PIPE ROW (employee_obj(emp.employee_id, emp.first_name, emp.last_name));
END LOOP;
RETURN;
END;
/
SELECT * FROM TABLE(get_employees(101));
最佳回答
GBase用户47954发表于 2个月前
感谢作者的精彩分享!
xinyiedc!发表于 2个月前
学习下。
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526