![](/img/trans.png)
[英]In MySQL, what does this simple nested SELECT clause mean exactly?
[英]What does a MySQL “NO SQL” function mean exactly?
MySQL“NO SQL”函數qualifer的含義是什么? 假設我有這個函數定義:
DELIMITER $$
CREATE FUNCTION Test() RETURNS text
NO SQL
BEGIN
DECLARE x TEXT DEFAULT '';
SET x = CONCAT('X = ', UUID());
RETURN x;
END $$
DELIMITER ;
這應該被聲明為NO SQL是否正確? 如果不是如何宣布?
如果上面不應該聲明為“NO SQL”,那么這個函數的例子是什么?
這意味着函數或過程中不包含SQL。
來自在線文檔 :
NO SQL
表示該例程不包含SQL語句。 它可能在那里作為優化輔助方法,允許將該函數標記為不需要SQL所必需的處理。 該組中的其他選項均表示不同級別的數據處理:
CONTAINS SQL
表示該例程不包含讀取或寫入數據的語句。 如果沒有明確給出這些特征,則這是默認值。 這些語句的示例是SET @x = 1
或DO RELEASE_LOCK('abc')
,它們既不執行讀取也不執行寫入數據。
NO SQL
表示該例程不包含SQL語句。
READS SQL DATA
表示例程包含讀取數據的語句(例如, SELECT
),但不包含寫入數據的語句。
MODIFIES SQL DATA
表示該例程包含可以寫入數據的語句(例如, INSERT
或DELETE
)。
這些實際上是SQL標准定義的子句,但有趣的是要注意該鏈接頁面的另一個引用:
在MySQL中,這些特征僅供參考。 服務器不使用它們來約束允許例程執行的語句類型。
換句話說,除了使語言與標准兼容之外,它們實際上並沒有在MySQL中做任何事情。
就不使用SQL的函數示例而言,您可能會使用一個字符串並在稍后返回哈希值以便存儲到數據庫中。
樣本函數的正確定義是CONTAINS SQL。 除了SQL之外,SQL標准允許函數使用其他語言,例如,不包含SQl的C函數將被定義為LANGUAGE C NO SQL。
AC函數也可以包含非修改SQL,然后標准SQL定義將是LANGUAGE C CONTAINS SQL。
在MySQL中,僅支持SQL,因此僅為支持標准而存在NO SQL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.