PLSQL TO TSQL , RECORE ,%TYPE,%ROWTYPE

 
SET NOCOUNT ON
GO
IF OBJECT_ID('TT') IS NOT NULL
    DROP TABLE tt
GO
CREATE TABLE TT
(
	f1     NVARCHAR(100) DEFAULT 'VAL',
	f2     NVARCHAR(100) DEFAULT 'VAL',
	f3     NVARCHAR(100) DEFAULT 'VAL',
	f4     NVARCHAR(100) DEFAULT 'VAL',
	f5     NVARCHAR(100) DEFAULT 'VAL',
	f6     NVARCHAR(100) DEFAULT 'VAL',
	f7     NVARCHAR(100) DEFAULT 'VAL',
	f8     NVARCHAR(100) DEFAULT 'VAL'
)

 GO
 	
DECLARE @I INT = 0
WHILE @I < 100
BEGIN
    INSERT INTO TT DEFAULT VALUES
    SET @I += 1
END
 
 
 
--SELECT *
--FROM   TT AS t 
GO
--方法1 用游标
DECLARE @f1     NVARCHAR(100),
        @f2     NVARCHAR(100),
        @f3     NVARCHAR(100),
        @f4     NVARCHAR(100),
        @f5     NVARCHAR(100),
        @f6     NVARCHAR(100),
        @f7     NVARCHAR(100),
        @f8     NVARCHAR(100)
 
DECLARE CUR CURSOR  
FOR
    SELECT F1,
           f2,
           f3,
           f4,
           f5,
           f6,
           f7,
           f8
    FROM   TT

OPEN CUR
BEGIN
	FETCH NEXT FROM CUR INTO @f1
	,@f2
	,@f3
	,@f4
	,@f5
	,@f6
	,@f7
	,@f8
	WHILE @@FETCH_STATUS = 0
	BEGIN
	    PRINT '@f1=' + @f1
	    PRINT '@f2=' + @f2
	    PRINT '@f3=' + @f3
	    PRINT '@f4=' + @f4
	    PRINT '@f5=' + @f5
	    PRINT '@f6=' + @f6
	    PRINT '@f7=' + @f7
	    PRINT '@f8=' + @f8 
	    FETCH NEXT FROM CUR INTO @f1
	    ,@f2
	    ,@f3
	    ,@f4
	    ,@f5
	    ,@f6
	    ,@f7
	    ,@f8
	END
END
CLOSE CUR
DEALLOCATE CUR

--方法2 用user define table type 
GO
IF EXISTS(
       SELECT 1
       FROM   SYS.types AS t
       WHERE  t.name = 'dealer_province_TABLE_TYPE'
   )
    DROP TYPE DBO.dealer_province_TABLE_TYPE
GO
CREATE TYPE dbo.dealer_province_TABLE_TYPE AS    TABLE --%TYPE
(
    ID INT,
    f1 NVARCHAR(100) DEFAULT 'VAL',
    f2 NVARCHAR(100) DEFAULT 'VAL',
    f3 NVARCHAR(100) DEFAULT 'VAL',
    f4 NVARCHAR(100) DEFAULT 'VAL',
    f5 NVARCHAR(100) DEFAULT 'VAL',
    f6 NVARCHAR(100) DEFAULT 'VAL',
    f7 NVARCHAR(100) DEFAULT 'VAL',
    f8 NVARCHAR(100) DEFAULT 'VAL'
    PRIMARY KEY CLUSTERED(ID)
)
GO
DECLARE @cursor dealer_province_TABLE_TYPE
DECLARE @RECORD dealer_province_TABLE_TYPE<span style="font-family: Arial, Helvetica, sans-serif;">--%ROWTYPE</span>

DECLARE @end INT = 0
DECLARE @begin INT = 1
INSERT INTO @cursor
SELECT ROW_NUMBER()OVER(ORDER BY f1)  AS ID,
       *
FROM   tt                             AS a

SELECT @end = MAX(id)
FROM   @cursor

WHILE @begin <= @end
BEGIN
    DELETE 
    FROM   @RECORD
    
    DELETE 
    FROM   @cursor OUTPUT DELETED.* INTO @RECORD--省去每个赋值
    WHERE  ID = @begin
    
    IF EXISTS (
           SELECT 1
           FROM   @RECORD
           WHERE  f1 = 'val'
       )
       AND @begin = 10
        SELECT *
        FROM   @RECORD
    
    SET @begin += 1
END


 
     
  
	        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 PL/SQL 中,可以通过以下方式对自定义类型进行直接赋值: 1. 使用 %TYPE 关键字 可以使用 %TYPE 关键字来声明一个变量与另一个变量或数据库列具有相同的数据类型。例如: DECLARE v_emp_id employees.employee_id%TYPE; v_salary employees.salary%TYPE; BEGIN SELECT employee_id, salary INTO v_emp_id, v_salary FROM employees WHERE employee_id = 100; -- 在此处可以直接使用 v_emp_id 和 v_salary 进行后续操作 END; 2. 使用 %ROWTYPE 关键字 可以使用 %ROWTYPE 关键字来声明一个变量与另一个表或游标具有相同的列结构。例如: DECLARE v_employee employees%ROWTYPE; BEGIN SELECT * INTO v_employee FROM employees WHERE employee_id = 100; -- 在此处可以直接使用 v_employee 行变量中的字段进行后续操作 END; 3. 直接赋值 在 PL/SQL 中,还可以直接对自定义类型进行赋值。例如: DECLARE TYPE employee_rec_type IS RECORD ( employee_id employees.employee_id%TYPE, first_name employees.first_name%TYPE, last_name employees.last_name%TYPE, hire_date employees.hire_date%TYPE, job_id employees.job_id%TYPE, salary employees.salary%TYPE ); v_employee employee_rec_type; BEGIN v_employee.employee_id := 100; v_employee.first_name := 'Steven'; v_employee.last_name := 'King'; v_employee.hire_date := TO_DATE('1987-06-17', 'YYYY-MM-DD'); v_employee.job_id := 'AD_PRES'; v_employee.salary := 24000; -- 在此处可以直接使用 v_employee 行变量中的字段进行后续操作 END; 注意,直接赋值需要保证字段顺序与类型定义的顺序相同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值