PARSING_USER_ID,PARSING_SCHEMA_ID,PARSING_SCHEMA_NAME in V$SQL

本文介绍了V$SQL中PARSING_USER_ID, PARSING_SCHEMA_ID, 和 PARSING_SCHEMA_NAME三个字段的关系,并通过实例说明了如何通过alter session设置来更改当前SCHEMA_ID和SCHEMA_NAME。

V$SQL 中

PARSING_USER_ID,PARSING_SCHEMA_ID,PARSING_SCHEMA_NAME

这三个字段之间的关系:

假如当前用户是HLDBA

默认情况下,当前SCHEMA_ID与USER_ID相同,SCHEMA_NAME就是当前用户名(HLDBA)。

但是当执行如下语句后,SCHEMA_ID 和SCHEMA_NAME就会发生改变

alter session set current_schema="SALESMGMT" ;

之后,USER_ID=(HLDBA USERID) ,

SCHEMA_ID,SCHEMA_NAME 皆属于SALESMGMT用户对应的ID和名字。

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/350519/viewspace-1048287/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/350519/viewspace-1048287/

<think>我们正在处理一个MySQL错误:FUNCTION dongan_release.MAX does not exist。这个错误通常发生在尝试调用一个不存在的函数时。用户可能正在使用一个名为`dongan_release.MAX`的自定义函数,但MySQL报告该函数不存在。 ### 可能的原因 1. **函数确实不存在**:可能从未创建过该函数,或者创建失败。 2. **函数存在但不在当前数据库**:函数可能创建在另一个数据库中,而当前数据库上下文不是该数据库。 3. **函数存在但用户没有执行权限**:当前用户可能没有执行该函数的权限。 4. **函数名或数据库名拼写错误**:可能函数名或数据库名有拼写错误,或者大小写不匹配(在区分大小写的系统上)。 ### 解决方案 #### 1. 确认函数是否存在 我们可以查询`information_schema.ROUTINES`表来检查函数是否存在: ```sql SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE FROM information_schema.ROUTINES WHERE ROUTINE_NAME = 'MAX' AND ROUTINE_SCHEMA = 'dongan_release'; ``` 如果查询没有返回结果,说明函数不存在。 #### 2. 创建函数(如果不存在) 如果函数确实不存在,我们需要创建它。但是,请注意,函数名`MAX`与MySQL的内置聚合函数`MAX()`冲突。通常,我们不建议创建与内置函数同名的自定义函数,这会导致歧义和错误。因此,建议重命名自定义函数。 如果必须创建,我们可以使用以下格式(注意:为了避免冲突,我们通常会给自定义函数加上前缀,例如`my_`): ```sql DELIMITER $$ CREATE FUNCTION dongan_release.`my_MAX`(a INT, b INT) RETURNS INT DETERMINISTIC BEGIN RETURN GREATEST(a, b); END$$ DELIMITER ; ``` 然后,在查询中使用`my_MAX`代替`MAX`。 但是,如果用户坚持要使用`MAX`作为函数名,则必须在调用时指定数据库名(以避免与内置函数冲突): ```sql SELECT dongan_release.MAX(column1, column2) FROM table_name; ``` 但即便如此,仍然可能因为与内置函数同名而导致不可预知的问题。因此,强烈建议重命名。 #### 3. 检查权限 如果函数存在,但当前用户没有执行权限,则需要授予权限: ```sql GRANT EXECUTE ON FUNCTION dongan_release.MAX TO 'current_user'@'localhost'; ``` #### 4. 使用完全限定名 在调用函数时,使用完全限定名(即`database_name.function_name`)可以避免歧义: ```sql SELECT dongan_release.MAX(column1) FROM table_name; ``` #### 5. 避免使用保留字或内置函数名 最好的做法是避免使用与内置函数相同的名称。建议修改函数名,例如改为`dongan_release.CUSTOM_MAX`。 ### 步骤总结 1. 检查函数是否存在。 2. 如果不存在,考虑创建(但强烈建议使用不同的名称)。 3. 如果存在,检查调用方式是否正确(使用完全限定名)以及权限问题。 4. 如果存在名称冲突,重命名自定义函数。 ### 示例:创建自定义最大值函数(避免名称冲突) 假设我们想要一个返回两个整数中较大值的函数,我们可以这样创建(使用非冲突名称): ```sql DELIMITER $$ CREATE FUNCTION dongan_release.CUSTOM_MAX(a INT, b INT) RETURNS INT DETERMINISTIC BEGIN IF a >= b THEN RETURN a; ELSE RETURN b; END IF; END$$ DELIMITER ; ``` 然后调用: ```sql SELECT dongan_release.CUSTOM_MAX(column1, column2) FROM table_name; ``` ### 注意事项 - 在MySQL中,函数名和数据库名是大小写敏感的,这取决于底层文件系统。因此,请确保大小写匹配。 - 如果函数是在另一个数据库中创建的,请确保在调用时使用正确的数据库名前缀,或者切换到该数据库。 §§相关问题§§ 1. 如何在MySQL中创建自定义函数? 2. MySQL函数名与内置函数冲突怎么办? 3. 如何查看MySQL中已有的自定义函数? 4. 如何授予用户执行MySQL函数的权限?</think>### 问题分析:FUNCTION dongan_release.MAX does not exist 错误解决方案 该错误表明 MySQL 无法找到名为 `MAX` 的自定义函数(属于 `dongan_release` 数据库)。以下是系统排查和解决方案: #### 1️⃣ **确认函数是否存在** ```sql -- 检查函数是否被创建 SELECT ROUTINE_NAME FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = 'dongan_release' AND ROUTINE_NAME = 'MAX'; ``` ▶️ 若**无结果** → 函数未创建(跳转至第3步) ▶️ 若**有结果** → 检查权限问题(跳转至第2步) #### 2️⃣ **权限问题排查(函数存在但不可用)** ```sql -- 授予执行权限(需管理员权限) GRANT EXECUTE ON FUNCTION dongan_release.MAX TO 'your_username'@'host'; FLUSH PRIVILEGES; ``` #### 3️⃣ **创建自定义函数(若不存在)** ```sql DELIMITER $$ CREATE FUNCTION dongan_release.MAX(a INT, b INT) RETURNS INT DETERMINISTIC BEGIN RETURN GREATEST(a, b); -- 实际逻辑按需修改 END$$ DELIMITER ; ``` > 📌 注意: > - 避免使用 `MAX` 作为函数名(与内置聚合函数冲突) > - 建议重命名为 `CUSTOM_MAX` 等唯一名称(如 `dongan_release.CUSTOM_MAX`) #### 4️⃣ **调用方式修正** ```sql -- 正确调用格式(需指定数据库名) SELECT dongan_release.MAX(price, cost) FROM products; -- 若重命名函数后 SELECT dongan_release.CUSTOM_MAX(price, cost) FROM products; ``` #### 5️⃣ **避免命名冲突** ```sql -- 错误:与内置MAX()冲突 SELECT MAX(price) FROM products; -- 实际调用内置函数 -- 正确:显式指定自定义函数 SELECT dongan_release.CUSTOM_MAX(price, cost) FROM products; ``` ### 关键建议 1. **函数命名规范**:使用 `dongan_` 前缀(如 `dongan_max`)避免冲突 2. **权限验证**:确保用户有 `CREATE ROUTINE` 和 `EXECUTE` 权限 3. **大小写敏感**:Linux 系统下 MySQL 函数名大小写敏感 4. **备份函数定义**:导出函数 DDL 语句 ```sql SHOW CREATE FUNCTION dongan_release.MAX; ``` > ⚠️ 若函数被意外删除,需用 `CREATE FUNCTION` 重建。建议在版本控制中保存函数定义脚本[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值