如何在定义的值区域内选择插入或更新列



我有一个包含不同值的列,假设它是一列中的子数据库。

例如:value1:abc、value2:123、value3:xyz。

如何使用select读取单个值,以及如何将其写回?

例如,我想读出值2:123,并想写回值2:789

问题是如何定义Select和UpdateFirebirdSQL顺序。

您可以通过UDF来实现。我不知道你更喜欢哪种语言,所以这是Delphi中的一个例子。您必须将库复制到firebird的udf目录,并使用声明数据库中的函数

DECLARE EXTERNAL FUNCTION GETVALUE
    CSTRING(32767),
    CSTRING(32767)
RETURNS CSTRING(32767) FREE_IT
ENTRY_POINT 'GetValue' MODULE_NAME 'Project1';
DECLARE EXTERNAL FUNCTION SETVALUE
    CSTRING(32767),
    CSTRING(32767),
    CSTRING(32767)
RETURNS CSTRING(32767) FREE_IT
ENTRY_POINT 'SetValue' MODULE_NAME 'Project1';

然后你可以在SQL语句中使用它吗:

SELECT GETVALUE(valuescolumn, 'Value1') from valuestable;

UPDATE valuestable SET valuescolum = SETVALUE(valuescolumn, 'Value1', 'NewValue')

我没有测试就把它写下来了,所以我不确定里面是否有语法错误

library Project1;
uses
  System.SysUtils,
  System.Classes;
{$IFDEF ib_util}
function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll';
{$ELSE}
function malloc(Bytes: Integer): Pointer; cdecl; external 'msvcrt.dll';
{$ENDIF}
function MemAlloc(Bytes: Integer): Pointer;
begin
{$IFDEF ib_util}
  Result:= ib_util_malloc(Bytes);
{$ELSE}
  Result:= malloc(Bytes);
{$ENDIF}
end;
function MakeResult(aString: string): PChar;
var
  fLength: Integer;
begin
  fLength:= Length(aString);
  Result:= MemAlloc(fLength+1);
  if fLength > 0 then
    Move(aString[1], Result[0], fLength);
  Result[fLength]:= #0;
end;
function GetValue(aValues, aValueName: PChar): PChar; cdecl; export;
var
  ValueList: TStringList;
  TempResult: string;
begin
  ValueList := TStringList.Create;
  try
    try
      ValueList.Text := aValues;
      ValueList.NameValueSeparator := ':';
      TempResult := ValueList.Values[aValueName];
      Result:= MakeResult(TempResult);
    except
      Result:= nil;
    end;
  finally
    ValueList.Free;
  end;
end;
function SetValue(aValues, aValueName, aValue: PChar): PChar; cdecl; export;
var
  ValueList: TStringList;
begin
  ValueList := TStringList.Create;
  try
    try
      ValueList.Text := aValues;
      ValueList.NameValueSeparator := ':';
      ValueList.Values[aValueName] := aValue;
      Result:= MakeResult(ValueList.Text);
    except
      Result:= nil;
    end;
  finally
    ValueList.Free;
  end;
end;
begin
end.

相关内容

  • 没有找到相关文章

最新更新