我的查询有点像这样:
CREATE FUNCTION func ... ;
SELECT * FROM ....;
Run Code Online (Sandbox Code Playgroud)
我使用的 phpPDO不允许在 a 中使用超过 1 个语句$pdo->query(),因此我决定将查询分成两个,因此我使用执行查询CREATE FUNCTION,$pdo->exec()然后$pdo->query()在 select 语句上使用。
但是,我在执行 select 语句时收到错误FUNCTION database.func does not exist。我该如何解决这个问题?当我在 phpmyadmin 中将其作为单个查询运行时,它工作正常
编辑:PHP代码:
class MyClass {
function connectPDO($user,$pass,$chartset="utf8"){
//simple function for making a new PDO object and mysql connection
$dbname = "my_db";
try {
//creating new pdo
$pdo = new PDO('mysql:host=localhost;dbname='.$dbname, $user,$pass);
//attributes set to throw errors and exceptions which can be …Run Code Online (Sandbox Code Playgroud) 我需要尝试在飞机上找到一个免费座位,然后保留该座位.
我需要返回一个值来表示成功与否以及座位号.通过环顾四周,我发现函数不能返回超过1的值,所以我考虑使用数组,但是查看那些文档,很明显我在PL/SQL上不太了解如何使用它们.
所以我在这里搁浅了.
到目前为止,我得到的代码如下所示:
CREATE OR REPLACE FUNCTION RESERVE_SEAT(P_NO VARCHAR2, ID NUMBER, RESERVE_TIME NUMBER, S_NO VARCHAR2)
RETURN INTEGER AS
RES INTEGER := 0;
COUNTS INTEGER := 0;
BEGIN
SELECT COUNT(*) INTO COUNTS FROM SEAT WHERE SEAT_NO=S_NO AND PLANE_NO=P_NO;
IF(COUNTS = 1) THEN
UPDATE SEAT
SET RESERVED = ID, BOOKING_TIME = RESERVE_TIME, BOOKED=ID
WHERE PLANE_NO=P_NO AND SEAT_NO=S_NO;
COMMIT;
ELSE IF(COUNTS = 0) THEN
RES := -1;
END IF;
END IF;
RETURN RES;
END RESERVE_SEAT;
Run Code Online (Sandbox Code Playgroud)
以上函数调用上述函数
CREATE OR REPLACE FUNCTION GET_FREE_SEAT(P_NO VARCHAR2, …Run Code Online (Sandbox Code Playgroud) 考虑一个包含以下行的表:
id | bigint
polygons | geometry(Polygon,4326)[]
Run Code Online (Sandbox Code Playgroud)
SELECT-ing 该polygons行返回一个不可读的二进制数据数组:
SELECT polygons FROM some_table WHERE id=405;
{0103000020E61000000100000006000000B84F039E5AC0E375243935C13F402...}
Run Code Online (Sandbox Code Playgroud)
st_AsText在第一个元素上使用会返回一个可读的输出:
SELECT st_AsText(polygons[1]) FROM some_table WHERE id=405;
POLYGON((-106.4689521119 31.7547183717742 ...)
Run Code Online (Sandbox Code Playgroud)
不出所料,该函数仅适用于元素,不适用于数组:
SELECT st_AsText(polygons) FROM some_table WHERE id=405;
ERROR: function st_astext(geometry[]) does not exist
Run Code Online (Sandbox Code Playgroud)
用 Python 术语来说,我正在寻找print [st_AsText(p) for i in polygons]PostgreSQL 中的等价物。
如何在 SELECT 语句中对数组的所有元素运行 PostgreSQL 函数,就像 Python 的列表理解一样?
附录
我认为这不是严格的重复,因为How to apply a function to each element of an array column in Postgres?处理内联数组(例如FROM unnest(ARRAY[1.53224,0.23411234]) …
我有一个表值函数.我还有一个标量值函数,我已经声明了一个临时表.我想在标量值函数内部执行表值函数,并在临时表中设置该值,如下所示
**Exec @tempTable=TableValuedFunction**
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?
这是表值函数
ALTER FUNCTION [dbo].[fn_Functiont]()
RETURNS TABLE
AS
RETURN
(
SELECT d.*, b.Name AS Name, ps.Name AS PaymentSystemName, c.UserName AS UserName, c.FirstName AS ClientFirstName, c.LastName AS LastName, c.Number AS DocumentNumber, c.Id
FROM Document AS d
JOIN System AS ps ON d.SystemId = ps.Id
JOIN Client AS c ON c.Id = d.ClientId
LEFT JOIN Shop AS b ON b.Id = d.ShopId
WHERE d.OperationTypeId IN (2, 4, 5) AND c.Type = 1
)
Run Code Online (Sandbox Code Playgroud) 我正在尝试运行此查询,直到不久前才能够运行。我不知道出了什么问题,我现在开始收到此错误?
Your database returned: ERROR: set-returning functions are not allowed in CASE Hint: You might be able to move the set-returning function into a LATERAL FROM item.
我的查询:
SELECT distinct
(CASE
WHEN {PERIOD} = 'Previous Quarter' AND pto.pto_start_date < (date_trunc('quarter', now() - INTERVAL '1 month') + INTERVAL '1 month')::date AND pto.pto_end_date >= (date_trunc('quarter', now() - INTERVAL '1 month') + INTERVAL '1 month')::date
THEN generate_series(pto.pto_start_date, pto.pto_end_date, '2 day'::interval)
WHEN {PERIOD} = 'Current Quarter' AND pto.pto_start_date < (date_trunc('quarter', now() - INTERVAL '1 …Run Code Online (Sandbox Code Playgroud) 我有一个简单的 PostgreSQL 函数,我认为它应该将值返回到单独的列中-115,101000005458E6258...但它返回一列,其中两个值用逗号分隔-115,101000005458E6258...。我的功能出了什么问题?
CREATE OR REPLACE FUNCTION public.get_direction()
RETURNS TABLE(direction integer, geom geometry)
AS $$
BEGIN
RETURN QUERY SELECT
heading-lag(heading) over (order by time) AS direction, a.geom AS geom
FROM public.mytable a
WHERE reg='125123'
GROUP BY heading, a.geom , a.time;
END; $$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我调用该函数
SELECT public.get_direction();
Run Code Online (Sandbox Code Playgroud)
谢谢。
我试图使用Spring jdbc执行Oracle函数.
但我收到了以下错误
CallableStatementCallback; bad SQL grammar [{? = call RATELIMIT_OWN.GET_LOGS(?, ?)}]; nested exception is java.sql.SQLException: ORA-06550: line 1, column 24: PLS-00653: aggregate/table functions are not allowed in PL/SQL scope ORA-06550: line 1, column 13: PLS-00382: expression is of wrong type ORA-06550: line 1, column 7: PL/SQL: Statement ignored
Run Code Online (Sandbox Code Playgroud)
Sql函数
CREATE OR REPLACE FUNCTION RATELIMIT_OWN.Get_Logs ( p_yyyymm VARCHAR2, p_numec NUMBER )
RETURN LOG_RECORD_TABLE PIPELINED IS
TYPE ref0 IS REF CURSOR;
cur0 ref0;
out_rec LOG_RECORD := log_record(NULL,NULL,NULL);
BEGIN
OPEN cur0 FOR …Run Code Online (Sandbox Code Playgroud) 这类是从前一个问题开始的:
根据where子句,查询运行速度非常慢.我重写了该查询使用CTE并很好地避免了问题,但从未找到答案.
另外一个类似的查询最近被调整为添加另一个字段,突然它的性能从大约需要30秒才能运行并返回10,000行,超过10个小时(并最终返回相同的结果集).今天我开始对这个进行故障排除,发现了一些奇怪的东西.
我一直需要从datetime值中提取日期唯一部分,因此我将逻辑写入函数:
CREATE FUNCTION [dbo].[cDate] ( @pInputDate DATETIME )
RETURNS DATETIME
BEGIN
RETURN CAST(CONVERT(VARCHAR(10), @pInputDate, 111) AS DATETIME)
END
GO
Run Code Online (Sandbox Code Playgroud)
我发现在这个新的低效查询中,如果我用查询中的CAST(CONVERT(VARCHAR(10), @pInputDate, 111) AS DATETIME)内联替换了该函数,查询执行的速度从大约10小时降到了不到2秒.我看到估计的执行计划没有区别.顺便说一句,这不是添加的领域.我假设添加其他字段以某种方式导致执行计划改变并放大上述条件.
我的问题是,这是正常的吗?如上所述,我使用重复过程的函数,因为如果你找到一种更有效的方法,它们更容易维护,记忆和更新.我应该为我的功能做些什么来提高他们的表现吗?
我有一个像下面描述的查询.
select CAST(0x83360B00 AS Date)
Run Code Online (Sandbox Code Playgroud)
当我在SQL服务器中运行此查询时,我能够获得日期格式的结果:
2012年12月15日
我想知道的是这是如何产生的.提前致谢.
In the ETL process, I receive a varchar field, and the length (of the value) is changed from row to row. I need to keep 5 symbols from the right side of the string. It means that I need to cut the left side but I can't, due to the unknown length.
我已经尝试过select substring('24:15:11',4, 5),但是对我没有帮助,字符串可能是'2019-05-01 22:15:11'。
sql:
select substring('24:15:11',4, 5)
Run Code Online (Sandbox Code Playgroud)
预期:
15:11
Run Code Online (Sandbox Code Playgroud) sql-function ×10
sql ×7
postgresql ×3
sql-server ×3
oracle ×2
t-sql ×2
arrays ×1
chartio ×1
java ×1
mysql ×1
pdo ×1
performance ×1
php ×1
plsql ×1
postgis ×1
presto ×1
select ×1
spring ×1