问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

oracle 函数,解释变量的使用和调用,本人菜鸟刚学oracle,看不懂函数间的使用,越详细越好

发布网友 发布时间:2022-04-07 16:56

我来回答

4个回答

懂视网 时间:2022-04-07 21:18

--##字符函数,大小写处理函数
SELECT LOWER('ABcDe') 
FROM dual; -- abcde,全部转换为小写

SELECT UPPER('ABcDe') 
FROM dual; -- ABCDE,全部转换为大写

SELECT INITCAP('aBcDe') 
FROM dual; -- Abcde,首字母大写


--##字符函数,字符串处理函数
SELECT SUBSTR('ABcDe',2,2)
FROM dual; -- Bc,截取字符串
SELECT SUBSTR('ABcDe',2)
FROM dual; -- BcDe,截取字符串
SELECT SUBSTR('ABcDe',-3,2)
FROM dual; -- cD,截取字符串

SELECT INSTR('ABcDefgdDh','D',3,2)
FROM dual; -- 9,从第三个字符串开始查询第二个字符D的位置
SELECT INSTR('ABcDefgdDh','D')
FROM dual; -- 4,从第一个字符串开始查询第一个字符D的位置

SELECT LPAD('ABcDe',10,'D')
FROM dual; -- DDDDDABcDe,左侧不足补字符串D
SELECT LPAD('ABcDe',3,'D')
FROM dual; -- ABc

SELECT RPAD('ABcDe',10,'D')
FROM dual; -- ABcDeDDDDD,右侧不足补字符串D
SELECT RPAD('ABcDe',3,'D')
FROM dual; -- ABc

SELECT REPLACE('ABcDeEe','e',8)
FROM dual; --ABcD8E8,替换字符

SELECT LENGTH('ABcDe')
FROM dual; -- 5,计算字符串长度

SELECT CONCAT('Hello','World') 
FROM dual; -- HelloWorld,连接字符串

SELECT TRIM('H' FROM 'HelloWorld') 
FROM dual; --elloWorld,去除首字母
SELECT TRIM('d' FROM 'HelloWorld') 
FROM dual; --HelloWorl,去除尾字母
SELECT TRIM('' FROM 'HelloWorld') 
FROM dual; --,隐藏字符


--数字函数
SELECT ROUND(245.1234) FROM dual; --245
SELECT ROUND(245.1234,2) FROM dual; --245.12
SELECT ROUND(245.6234,0) FROM dual; --246
SELECT ROUND(245.1234,-2) FROM dual; --200
SELECT ROUND(255.1234,-2) FROM dual; --300

SELECT ROUND(-245.1234,2) FROM dual; -- -245.12
SELECT ROUND(-245.6234,0) FROM dual; -- -246
SELECT ROUND(-245.1234,-2) FROM dual; -- -200
SELECT ROUND(-255.1234,-2) FROM dual; -- -300

SELECT TRUNC(245.1234,2) FROM dual; -- 245.12
SELECT TRUNC(245.6234,0) FROM dual; -- 245
SELECT TRUNC(245.1234,-2) FROM dual; -- 200
SELECT TRUNC(255.1234,-2) FROM dual; -- 200

SELECT MOD(1600,300) FROM dual; -- 100
SELECT MOD(1500,300) FROM dual; -- 0 


--日期函数
SELECT SYSDATE 
FROM dual; -- 2012-05-12 12:50:18 ,当前日期

SELECT MONTHS_BETWEEN('15-4月-2012','01-1月-2012') 
FROM dual; -- 3.45161290322581,两个日期之间的月数

SELECT ADD_MONTHS(SYSDATE,2)
FROM dual; --2012-07-12 14:23:32,添加月份到日期字段中

SELECT NEXT_DAY('15-4月-2012',3)
FROM dual; --2012-04-17 ,添加天数到日期字段中
SELECT NEXT_DAY(SYSDATE,'星期一') 
FROM dual; 

SELECT LAST_DAY(SYSDATE)
FROM dual; --2012-05-31 14:25:22,本月份的最后一天

SELECT ROUND(SYSDATE,'month') 
FROM dual; --2012-05-01,月份四舍五入
SELECT ROUND(SYSDATE) 
FROM dual; --2012-05-13

SELECT TRUNC(SYSDATE,'month') 
FROM dual; --月份截取
SELECT TRUNC(SYSDATE,'day') 
FROM dual; 


--转化函数
SELECT '123' + 123 FROM dual;  --246,字符串隐式转化

SELECT TO_CHAR(123456.6543,'L099,999.00') AS "Number Format"
FROM dual;    --若是常量数字,需在前加0
SELECT TO_CHAR(123456.6543,'$099,999.00') AS "Number Format"
FROM dual;
SELECT TO_CHAR(SYSDATE,'DAY DD-MON-YYYY') AS "Data Format"
FROM dual;   --星期二 15-5月 -2012

SELECT TO_DATE('12-5-2012','DD-MM-YYYY') 
FROM dual;   --格式字符串必须有。没有意义?

SELECT TO_NUMBER('5432.1234') 
FROM dual;
SELECT TO_NUMBER('15,155,100.56','999,999,999.00') 
FROM dual;   --变量字符串与格式字符串的格式必须一致


--常规函数
SELECT NVL(NULL,0) FROM dual; -- 0
SELECT NVL(NULL,'N/A') FROM dual; -- N/A
SELECT NVL(123,0) FROM dual; -- 123
SELECT NVL('学生','N/A') FROM dual; -- 学生

SELECT NVL2(NULL,0,1) FROM dual; -- 1
SELECT NVL2(123,0,1) FROM dual; -- 0

SELECT NULLIF(1,1) FROM dual; -- NULL
SELECT NULLIF(2,1) FROM dual; -- 2
SELECT NULLIF('好','不好') FROM dual; -- 好

SELECT COALESCE(NULL,NULL,'不好','好') FROM dual; -- 不好,参数必须为同一数据类型

--DECODE示例
DECODE 

SELECT last_name, job_id, salary,
DECODE(job_id, 'IT_PROG', 1.10*salary,
  'ST_CLERK', 1.15*salary,
  'SA_REP', 1.20*salary,
    salary) REVISED_SALARY
FROM employees;

--CASE THEN示例
CASE
 WHEN THEN
 WHEN THEN
 ELSE
END

SELECT last_name, job_id, salary,
CASE job_id 
 WHEN 'IT_PROG' THEN 1.10*salary
 WHEN 'ST_CLERK' THEN 1.15*salary
 WHEN 'SA_REP' THEN 1.20*salary
 ELSE salary 
END "REVISED_SALARY"
FROM employees;


--##分组函数
AVG
COUNT
MAX
MIN
SUM
STDDEV
VARIANCE


/*
IN、ANY、ALL运算符
 IN 等于列表中的任意一个。
 < ANY 意味着低于最高值;> ANY 意味着高于最低值;= ANY 等同于 IN。
 < ALL 意味着低于最低值;> ANY 意味着高于最高低值。

示例:
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
 
*/

--创建脚本示例
INSERT INTO departments (department_id, department_name, location_id)
VALUES (&"Department Id",'&"Department Name"',&Location_Id);


/*
MERGE语句
 提供有条件地在数据表中更新或插入数据的功能。
 如果该行存在就执行UPDATE,如果是新行则执行INSERT
示例:在COPY_EMP表中插入或更新行,以便与EMPLOYEES表匹配
MERGE INTO copy_emp c
 USING employees e
 ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
 UPDATE SET
 c.first_name = e.first_name,
 c.last_name = e.last_name,
 ...
 c.department_id = e.department_id
WHEN NOT MATCHED THEN
 INSERT VALUES(e.employee_id, e.first_name, e.last_name,
 e.email, e.phone_number, e.hire_date, e.job_id,
 e.salary, e.commission_pct, e.manager_id, 
 e.department_id);

*/


--显式事务控制语句
COMMIT
ROLLBACK
SAVEPOINT name_values
ROLLBACK TO SAVEPOINT name_values

--ALTER TABLE语句示例
ALTER TABLE dept80
ADD (job_id VARCHAR2(9));

ALTER TABLE dept80
MODIFY (last_name VARCHAR2(30));

ALTER TABLE dept80
DROP COLUMN job_id;

--SET UNUSED标记不可用与删除表全部不可用字段
ALTER TABLE emp SET UNUSED(department_id) 
ALTER TABLE emp DROP UNUSED COLUMNS; --不能删除某一个不可用字段,若删除将全部删除。

--RENAME重命名对象
RENAME employees2 TO emp

--COMMENT向表中添加字段
COMMENT ON TABLE employees
IS 'Employee Information';

--约束类型
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK

CREATE TABLE employees(
 employee_id NUMBER(6),
 first_name VARCHAR2(20),
 ...
 job_id VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));

CREATE TABLE employees(
 employee_id NUMBER(6),
 email  VARCHAR2(25),
 ...
 department_id NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
 REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE(email));

CREATE TABLE employees(
 employee_id NUMBER(6),
 hire_date DATE NOT NULL,
 ... 
CONSTRAINT emp_email_uk UNIQUE(email));

CREATE TABLE employees(
 employee_id NUMBER(6),
 ...
 salary NUMBER(2)
CONSTRAINT emp_salary_min CHECK (salary > 0),...

ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk 
FOREIGN KEY(manager_id) 
REFERENCES employees(employee_id);

ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;

ALTER TABLE departments
DROP PRIMARY KEY CASCADE; --删除departments表上的PRIMARY KEY约束,并删除employees.department_id列上关联的FOREIGN KEY约束。

ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk CASCADE; --禁用约束

ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk; --启用约束


/*
级联约束
 CASCADE CONSTRAINTS子句是和 DROP COLUMN子句一起使用的。
 CASCADE CONSTRAINTS子句会删除涉及到在已删除列上定义的主键或唯一关键字的所有引用完整性约束。
 CASCADE CONSTRAINTS子句还将删除在已删除列上定义的鄋多列约束。


CREATE TABLE test1 (
 pk NUMBER PRIMARY KEY,
 fk NUMBER,
 col1 NUMBER,
 col2 NUMBER,
CONSTRAINT fk_constraint FOREIGN KEY (fk) REFERENCES test1,
CONSTRAINT ck1 CHECK (pk > 0 and col1 > 0),
CONSTRAINT ck2 CHECK (col2 > 0));

ALTER TABLE test1 
DROP (pk) CASCADE CONSTRAINTS;

ALTER TABLE test1 
DROP (pk, fk, col1) CASCADE CONSTRAINTS;

*/


--视图使用WITH CHECK OPTION子句
CREATE OR REPLACE VIEW empvu20
AS 
SELECT * FROM employees
WHERE department_id = 20
WITH CHECK OPTION CONSTRAINT empvu20_ck --引用约束empvu20_ck


--视图拒绝DML操作
WITH READ ONLY


--排序TOP-N分析:伪列ROWNUM关键字
SELECT ROWNUM as RANK, last_name, salary 
FROM (SELECT last_name,salary FROM employees
ORDER BY salary DESC)
WHERE ROWNUM <= 3;


--序列
CREATE SEQUENCE dept_deptid_seq
  INCREMENT BY 10 --步长
  START WITH 120 --开始位
  MAXVALUE 9999 --结束位
  NOCACHE  --
  NOCYCLE;  --达到结束位不重新开始循环

ALTER SEQUENCE dept_deptid_seq
  INCREMENT BY 20
  MAXVALUE 999999
  NOCACHE
	 NOCYCLE;

--序列中的伪列,
NEXTVAL 
CURRVAL

INSERT INTO departments(department_id,department_name,location_id)
VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);

SELECT dept_deptid_seq.CURRVAL
FROM dual;

--索引
CREATE INDEX emp_last_name_idx
ON employees(last_name);


--同义词
CREATE SYNONYM emp
FOR employees;

CREATE PUBLIC SYNONYM dept
FOR departments





Oracle基础函数及对象示例学习总结

标签:oracle   基础函数   基础对象   

热心网友 时间:2022-04-07 18:26

declare 是定义的关键字,说明下面的部分是定义部分,一直到begin结束,begin到end之间是代码段。
v_sum,v_num 是变量名,被声明为number类型。
函数get_salary()声明了两个变量,一个返回值。
oracle的参数有两种属性,in,out。一般默认为in,就是传值的,out类型可以理解为c里面的形参,传地址一类的,声明为OUT属性的参数,可以把函数对参数的修改带出来。
比如下面:
CREATE OR REPLACE
FUNCTION test(
v_var1 NUMBER,
v_var2 OUT NUMBER)
RETURN NUMBER IS
v_var1:=v_var1+1;
v_var2:=v_var2+1;
return v_var1;
调用
DECLARE
v_var1 NUMBER;
v_var2 NUMBER;
v_var3 NUMBER;
BEGIN
v_var1:=1;
v_var2:=1;
v_var3 :=test(v_var1, v_var2);
DBMS_OUTPUT.PUT_LINE('v_var1='||v_var1||'\nv_var2='||v_var2||'\nv_var3='||v_var3);
END;
那么输出应该是
v_var1=1
v_var2=2
v_var3=2
理解了out的含义,再看你的代码就容易了
因为函数申明emp_count为out,所以他将带出在函数中的变化。
函数里有select count(*) into emp_count from .........样子的语句。所以函数执行完成后这个变量的值其实是该部门的人数。
写了这么长了啊。。。。
不知道讲清楚了没。
exption我就不解释了吧。有其他问题请追问。
个人对oracle也比较感兴趣,但现在的工作和这个不相关了,希望能一起进步。有类似oracle的问题可以直接找我。其实我不是大拿,要是想神马问题都马上得到答案请忽略这段话。我汗!!

热心网友 时间:2022-04-07 19:44

CREATE OR REPLACE
FUNCTION get_salary(//函数
Dept_no NUMBER,//输入参数
Emp_count OUT NUMBER)//输出参数
RETURN NUMBER //返回参数
IS
V_sum NUMBER;//这是声明函数的局部变量
BEGIN
SELECT SUM(SALARY), count(*) INTO V_sum, emp_count//这里用到形参,emp_count是output类型的参数,会返回
FROM EMPLOYEES WHERE DEPARTMENT_ID=dept_no;
RETURN v_sum;//返回v_sum的值
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END get_salary;
调用
DECLARE//这里是调用时声明变量
V_num NUMBER;
V_sum NUMBER;
BEGIN
V_sum :=get_salary(10, v_num);//v_num,v_sum这两个变量调用函数得到值,v_num是emp_count得到的值,v_sum是函数里return的v_sum的值
DBMS_OUTPUT.PUT_LINE('部门号为:10的工资总和:'||v_sum||',人数为:'||v_num);
END;追问问题好多啊
RETURN NUMBER 返回的是
Dept_no NUMBER,还是
Emp_count OUT NUMBER
还有V_sum NUMBER 是否可以放入定义函数的位置,也就是变量是不是能当参数用

追答RETURN NUMBER 指的是返回一个NUMBER类型的变量,也就是后面 RETURN v_sum;中的v_sum,假设函数sum=f(no,count),这里的v_sum相当于sum,就是函数执行后得到的值,Dept_no 没有out修饰,是一般类型的参数,只是传值,在后来调用函数 V_sum :=get_salary(10, v_num);时,传入了10,而 Emp_count 有out修饰,所以在函数执行后会把值保留下来,可以在外面调用,类似引用传递。V_sum 是定义的NUMBER 类型变量,用于返回函数得到的结果,他不是参数。不知道这样解释你能不能明白?

热心网友 时间:2022-04-07 21:18

call GetPY(@str varchar(500)) 就可以了
sql2005中是exec GetPY(@str varchar(500)) 。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 淘宝爱情树怎么拔掉 支付宝爱情树换树苗后会退化嘛 火影忍者差点一脚踢出大结局的那是多少集 鸡兔同笼是一个著名的数学问题,教材中介绍了哪四种方法?古代常用哪种方法解决此问题,真乃妙想 分手之后前女友没有把支付宝爱情树退出 《火影忍者》曾经差点一脚踢出大结局的忍术究竟有多强 我不会骑自行车,为了上学方便我一直想学电动车,可就是学不会,平衡感差,要怎么办,很想学??? 我好几次差点脚在他们中间把他们碰倒,把字表达什么。 有哪些电影名字里有脚字 每次喝酒脸红不说了,连身体上也红,就差脚指头没红了,,,这是不是对身体有很大的伤害。 怎么样修改电脑配置信息的?我买电脑时上了这个当, 鸡兔同笼解题技巧 贪婪洞窟炼金套装怎么获得 炼金套装获取攻略详解 纸大师可以修改电脑配置信息么? 鸡兔同笼,上面共有36个头,下面有112只脚,问鸡兔各有多少只? 36个头50只脚 鸡兔同笼,鸡和兔各有多少只 电脑配置信息修改一下 鸡兔同笼和数学竞赛 【LOL】谁有这张阿狸的全图啊 这张都没有脚 身子都画好了 就差脚…… 「叉」错脚定「差」错脚定还是另有其字? 支付宝的爱情树一开始俩个人种,后来一个人 如果好友爱情树已经两个人了是不是就不能再申请加入了? 不是管理员怎么样将爱情树取消 如果分手支付宝小荷包里钱怎么办 鲁迅关于人只要有钱,这段话是在哪里说的呢? 魔芋豆腐怎么做法视频 人只要有钱,烦恼就会减掉90%以上,情商和智商也会提高,更不会乱发火。 出自鲁迅的那一篇文章? 鲁迅说过:人只要有钱 这句话哪里来的图片 缺爱重要还是钱重要? 贫贱夫妻百事哀,这句话怎么解释? 烦恼少一半上一句 鲁迅在哪里说鲁迅说过:鲁迅说过:人只要有钱……… 鲁迅言:人要有铜钱的性格? 鸡腿炒魔芋豆腐的做法 鲁迅说钱可以解决90%以上的问题 生活各自不易,个人所求不同,各自立场不一, 勿在别人心中修行自己,勿在自己心? 我记得鲁迅说过一句关于金钱和爱情的话,是什么? 空腹和饱腹那种情况更容易晕车 想什么为法挣钱 晕车的人,空腹比较容易晕,还是吃饱了比较容易晕?谢谢!