SQL_substr函数实验

原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。

深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/39966251

【格式】

截取函数,可以实现提取字符串中指定的字符数

substr( string, start_position, [ length ] )

string:源字符串

start_position:提取的位置,字符串中第一个位置始终为1

[ length ]:提取的字符数,如果省略,substr将返回整个字符串

【实验】

目标:

体会substr函数的用法

实验思路:

实现将某列上指定字符位数的数据插入到指定的列上

模拟现场需求:

设想稍微复杂一下,我们假定需要将ename列的内容更改为ename1列的内容,但此时ename1列的字段长度超过了ename列的字段要求的最大长度,经过查看发现出现ename1列字段超出ename列字段长度的原因是ename1列数据类型为char(15),而且实际有效数据长度不到7个字符,所以只需要将ename1列的前7位字符全部提取出来插入到ename列即可。这也说明对于定长char类型,当输入字符不足定长时是会用空格进行补位的。

说明:

这种实验想法的出现,其实是映射了实际生产需求中的一个例子。在实际生产环境上,要实现把一个用户的信息某一列的数据抽取到另外一个用户上,但由于两者列的数据类型不同,存在空格致使字段长度超过了另外一个用户要求该列字段的长度,而两者不可以更改数据类型,但是有效的字段数是都符合这两个列的,因此想到使用substr来完成这个操作。

SQL> create table hyl as select * from emp where 1=2;
--创建实验表
Table created

SQL> select * from hyl;
--查询实验表,目前数据为空
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------

SQL> alter table hyl add(ename1 char(15));
--向实验表中添加实验列ename1,用于模拟长字符字段
Table altered

SQL> insert into hyl(ename1) select emp.ename as ename1 from emp;
--将emp表的ename列数据以定长字段的数据类型插入到了实验表hyl的ename1列上,此时ename1字段长度为15
14 rows inserted

SQL> select * from hyl;
--查看插入到ename1列上的数据
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO ENAME1
----- ---------- --------- ----- ----------- --------- --------- ------ ---------------
                                                                        SMITH
                                                                        ALLEN
                                                                        WARD
                                                                        JONES
                                                                        MARTIN
                                                                        BLAKE
                                                                        CLARK
                                                                        SCOTT
                                                                        KING
                                                                        TURNER
                                                                        ADAMS
                                                                        JAMES
                                                                        FORD
                                                                        MILLER
14 rows selected

SQL> select count(1) from hyl t where length(t.ename1)=15;
--验证一下,ename1列字段超过10的数据行数
  COUNT(1)
----------
        14

SQL> desc hyl;
--查看hyl表的表结构,可以看到ename1列为char(15),ename列为varchar2(10)
Name     Type         Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO    NUMBER(4)    Y
ENAME    VARCHAR2(10) Y
JOB      VARCHAR2(9)  Y
MGR      NUMBER(4)    Y
HIREDATE DATE         Y
SAL      NUMBER(7,2)  Y
COMM     NUMBER(7,2)  Y
DEPTNO   NUMBER(2)    Y
ENAME1   CHAR(15)     Y   

SQL> update hyl t set t.ename=t.ename1;
--更新ename列为ename1上数据时,报错了如下,提示ename字段长度(10)小于ename1字段长度(15),无法完成数据的更新
update hyl t set t.ename=t.ename1
ORA-12899: value too large for column "SCOTT"."HYL"."ENAME" (actual: 15, maximum: 10)

SQL> update hyl t set t.ename=substr(t.ename1,1,7);
--使用substr函数,只把ename1列的前7个字符的内容更新到ename列上
14 rows updated

SQL> select * from hyl;
--再次查看hyl表,发现ename列的数据已经成功更新为enam1列上的数据
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO ENAME1
----- ---------- --------- ----- ----------- --------- --------- ------ ---------------
      SMITH                                                             SMITH
      ALLEN                                                             ALLEN
      WARD                                                              WARD
      JONES                                                             JONES
      MARTIN                                                            MARTIN
      BLAKE                                                             BLAKE
      CLARK                                                             CLARK
      SCOTT                                                             SCOTT
      KING                                                              KING
      TURNER                                                            TURNER
      ADAMS                                                             ADAMS
      JAMES                                                             JAMES
      FORD                                                              FORD
      MILLER                                                            MILLER
14 rows selected

SQL> desc hyl;
--再次查看hyl表的数据结构,体会如何将ename1列数据类型为char(15)中前7个字符插入到数据类型为varchar2(10)的ename列上去的
Name     Type         Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO    NUMBER(4)    Y
ENAME    VARCHAR2(10) Y
JOB      VARCHAR2(9)  Y
MGR      NUMBER(4)    Y
HIREDATE DATE         Y
SAL      NUMBER(7,2)  Y
COMM     NUMBER(7,2)  Y
DEPTNO   NUMBER(2)    Y
ENAME1   CHAR(15)     Y     

原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。

深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/39966251

时间: 2024-08-28 03:57:32

SQL_substr函数实验的相关文章

SQL_wm_concat函数实验:实现字段合并

原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明以下出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/41347109 wm_concat函数:字段合并函数 目标:根据某字段相同值,实现其它某字段合并 [实验] 使用实验scott用户下的emp表 SQL> select * from emp; --先来查看一下emp表的全部内容 EMPNO JOB        

二.PTA函数实验

一.PTA实验作业(函数) 题目一:   1.本题PTA提交列表: 2.设计思路(包括流程图),主要描述题目算法 //设计思路,由题目可知 3.本题调试过程碰到的问题及PTA提交的情况说明(**注意:调试过程必须截图说明如何调试,如何解决问题,PTA提交的列表中的每一个错误详细说明为什么及如何解决) 题目二: 1.本题PTA提交列表: 2.设计思路(包括流程图),主要描述题目算法 3.本题调试过程碰到的问题及PTA提交的情况说明(**注意:调试过程必须截图说明如何调试,如何解决问题,PTA提交的

第六章 实验报告(函数与宏定义)

实验项目:函数的定义和调用 模块化程序设计 实验练习1:编写由三角形三边求面积的函数 实验目的: 调用area()函数求三角形的面积 在求面积函数运用海伦公式 问题描述:编写程序,从键盘输入三角形的3条边,调用三角形面积函数求出其面积,并输出结果. 程序框图: 程序实现: #include<math.h> #include<stdio.h> float area(float a,float b,float c) { float s,p,area; s=(a+b+c)/2; p=s*

COM接口函数通用Hook方法

本文是我的本科学位论文, 今发表在此, 以示原创之据 第1章 绪论 研究背景 研究意义 相关技术简介 COM概述 COM内存模型描述及C语言和C++语言实现 调用约定 Hook API原理 Windows钩子原理及进程注入 开发及调试环境 第2章 问题抽象及关键技术研究 实验01:通过调试器查看C++类的虚函数表 实验02:通过函数指针调用C++虚函数 实验03:交换两个相同C++类的虚函数表 实验04-1:替换C++虚函数表中的虚函数(__thiscall)地址 实验04-2:替换C++虚函数

Linux第8次实验——谢飞帆

原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1.理解进程上下文的切换机制,以及与中断上下文切换的关系 用户态进程它在用户的时候,它没法直接调用schedule(),因为schedule是个内核函数,而且它也不是一个系统调用,没法直接调用它,只能间接的调用它,间接的调用schedule()的时机就是中断处理过程 对于用户态进程,它要从当前运行中的进程切换出去的话,那么它就必须要进入

信息安全不可错过的30门实验

信息安全不可错过的30门实验 美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼翻译制作的SEEDLabs在线实验课永久免费并开源. SEEDLabs官网:http://www.cis.syr.edu/~wedu/seed/index.html SEEDLabs中文版开源项目:https://github.com/shiyanlou/seedlab

【知识分享】信息安全全系列SEED实验——来自Syracuse SEED labs

美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼翻译制作的SEEDLabs在线实验课永久免费并开源. - SEEDLabs官网:http://www.cis.syr.edu/~wedu/seed/index.html - SEEDLabs中文版开源项目:https://github.com/shiyanlou/seedlab - SEEDLabs

C++学习,实验四

一,draw()函数 void graph::draw() { int i,j; for(i=1;i<=size;i++) { for(j=1;j<=size-i;j++) { cout<<" "; } for(j=1;j<=2*i-1;j++) { cout<<symbol; } for(j=1;j<=size-i;j++) { cout<<" "; } cout<<endl; } draw(

ARM实验5 —— 按键中断实验

key_int按键中断实验 实验内容: 通过开发板上的按键中断控制led灯并打印信息. 通过简单事例说明猎户座4412处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识别按键被按下时进入相应的中断处理函数 实验目的: 熟悉开发环境的使用 掌握猎户座4412处理器的中断过程及编程. 实验平台: fs4412开发板,eclipse,secureCRT. 实验步骤: 1.查看key2在开发板的位置: 2.查看UART_RING在核心板的位置: 3.查看GPX1在芯片手册的位置: